2016-05-15 9 views
0

同じ名前を持つすべての人の合計年齢を計算したいと思います:ここの例の表を参照してください。Python - 合計を実行し、新しい列に回答を格納するループ

table with names

これは..私はこれまでに書いたコードですが、それは完全ではありません、それは動作しません..私はこの問題を解決するかと私は書くことができますどのように

final_df = DataFrame() 

for i in [list of names]: 
dummy = sort_df.loc[sort_df['name'] == i]  
total_age = 0 

for j in dummy.age:  
    age2 = dummy.age(j) 

    total_age = total_age + age2 

    final_df.append(total_age) 


final_df['total_age'] = total_age 

同じ名前の人びとを繰り返し、それらを合計してこれらを新しい列に格納するコード

最後で、それは次のようになります。

Result

+0

あなたがして、ファイルを更新するにはindenが見つかりません最初のforループの記述。あなたは 'csv'タグを付けたので、csvファイルのすべてのデータですか? –

+0

はい名前と年齢の2つの列を持つCSVファイルがあります。 – Papie

+0

おそらく、リストを反復するのではなく、csvファイルを繰り返し処理すべきですか? – Papie

答えて

2

を私は持っていinput.csvという名前のcsvファイルがあるとしこのデータはsort_dfに既に読み込まれています。

name,age,total age 
Alfredo,13, 
Alfredo,12, 
Alfredo,15, 
Jaap,12, 
Jaap,14, 
Koen,16, 
Lian,76, 
Lian,45, 
Lian,34, 
Lian,14, 

この場合、別のdummyデータフレームを宣言する必要はありません。これを使用します。

from pandas import DataFrame 

sort_df = DataFrame.from_csv("inCSV.txt", index_col=False) 
final_df = sort_df 

# Use a dictionary to keep track instead 
total_age = {} 
for name in sort_df["name"]: 
    if name not in total_age.keys(): 
     total_age[name] = 0 

# Add up the ages 
for index in xrange(len(sort_df)): 
    person = sort_df.loc[index] 
    name = person["name"] 
    age = person["age"] 
    total_age[name] += age 

# Set the new ages into final_df 
for index in xrange(len(final_df)): 
    person = final_df.loc[index] 
    name = person["name"] 
    final_df.set_value(index, "total age", total_age[name]) 

print final_df 

final_dfで)あなたを与えるであろう:

 name age total age 
0 Alfredo 13  40.0 
1 Alfredo 12  40.0 
2 Alfredo 15  40.0 
3  Jaap 12  26.0 
4  Jaap 14  26.0 
5  Koen 16  16.0 
6  Lian 76  169.0 
7  Lian 45  169.0 
8  Lian 34  169.0 
9  Lian 14  169.0 
+0

それは働いた!ありがとう! – Papie

0

をあなたはここで答えを見つける:

あなたのコードを見てみると
from collections import defaultdict 
list_name = [ 
{'age': 25, 'name': 'alfredo'}, 
{'age': 44, 'name': 'alfredo'}, 
{'age': 23, 'name': 'jaap'}, 
{'age': 60, 'name': 'jaap'} 
] 

k={} 
c = defaultdict(int) 
for d in list_name: 
    c[d['name']] += d['age'] 
    k[d['name']] = c[d['name']] 
for d in list_name: 
    d['total_age'] = k[d['name']] 
print list_name 
1

例えばデータ、

name,age 
Alfredo,13, 
Alfredo,12, 
Alfredo,15, 
Jaap,12, 
Jaap,14, 
Koen,16, 
Lian,76, 
Lian,45, 
Lian,34, 
Lian,14, 

import csv 
from collections import defaultdict 
result = defaultdict(int) 
reader = csv.DictReader(csv_file_handle) 
for person in reader: 
    name = person['name'].lower() 
    age = int(person['age']) 
    result[name] += age 
>>> result 
defaultdict(int, {'alfredo': 40, 'jaap': 26, 'koen': 16, 'lian': 169}) 

result

# make a reader object  
# make a writer object with fieldnames ['name', 'age', 'total_age'] 
# write header 
for person in reader: 
    person.update({'total_age': result[person['name'].lower()]}) 
    writer.writerow(person) 
関連する問題