【问题标题】:Python - For loop that performes a sum and stores answer in new columnPython - 执行求和并将答案存储在新列中的 For 循环
【发布时间】:2016-05-15 10:55:10
【问题描述】:

我想计算所有同名人员的总年龄:请参见此处的示例表。

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

【问题讨论】:

  • 您缺少第一个 for 循环的缩进。既然您标记了csv,那么您的所有数据都在一个 csv 文件中吗?
  • 是的,我有一个包含所有 2 列的 csv 文件:姓名和年龄。
  • 也许我不应该遍历列表,而是遍历 csv 文件?
  • 我要重新问这个问题,因为我发现有些东西不见了 :( 感谢您的提示 Moon Cheesez

标签: python python-3.x csv for-loop


【解决方案1】:

查看您的代码,我假设有一个名为 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

【讨论】:

    【解决方案2】:

    例如数据,

    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)
    

    【讨论】:

      【解决方案3】:

      你在这里找到答案:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-22
        相关资源
        最近更新 更多