【问题标题】:Group by multple columns and return SUM of one column in a for loop按多列分组并在 for 循环中返回一列的总和
【发布时间】:2018-04-02 10:48:31
【问题描述】:
  • 我有一个包含许多列的 csv 文件。对于此处的示例,我总共使用了 6 列:

  • 我正在使用 Python3 和 Pandas(我不太熟悉)。

  • 我的主要目标是在烘焙当前文件中的数据后创建一个新的 csv 文件(如上所示)。我想分步做的:

01) 聚合数据:首先,按 ID 对行进行分组并具有:

  1. 每个ID

  2. 的最早开始日期
  3. 每个ID

  4. 的最新结束日期
  5. 每个 ID

  6. 的值的总和

02) 对每个 ID 的行和我选择并拥有的任何随机列进行分组:

  1. 每个ID

  2. 的最早开始日期
  3. 每个ID

  4. 的最新结束日期
  5. 每个 ID

  6. 的值的总和
  7. 在其余数据旁边显示 Random1Random2 值(分组)

没有对数据进行分组,我能够得到最早的开始日期、最晚的结束日期的总和。代码如下(1个ID):

#Get the first Start Date
minStartDate = df.loc[ df['ID'] == 56886, 'Start Date'].min()

#Get the last End Date
maxEndDate = df.loc[ df['ID'] == 56886, 'End Date'].max()

#Get the value sum
sumValue = df.loc[ df['ID'] == 56886, 'Value'].sum()

然后我按所有 ID 对其进行分组:

for i in ID:
    #Get the first Start Date
    minStartDate = df.loc[ df['ID'] == i, 'Start Date'].min()
    #Get the last End Date
    maxEndDate = df.loc[ df['ID'] == i, 'End Date'].max()
    #Get the Value sum
    sumValue = df.loc[ df['ID'] == i, 'Value'].sum()

print(maxEndDate)

我在打印后得到了正确的 ma​​xEndDateminStartDatesumValueID 值。问题是它只显示了一个 ID(文件中的最后一个)的值:

在这种情况下,这是预期的输出(在忽略随机列之后):

所以,我已将脚本更改为:

minStartDate = {}
maxEndDate = {}
summyValue = {}
Key = {}
ID = df[' ID']

for i in ID:
    Key[i] = df.loc[ df['ID'] == i, 'ID']
    #Get the first Start Date
    minStartDate[i] = df.loc[ df['ID'] == i, 'Start Date'].min()
    #Get the last End Date
    maxEndDate[i] = df.loc[ df['ID'] == i, 'End Date'].max()
    #Get the Value sum
    summyValue[i] = df.loc[ df['ID'] == i, 'Value'].sum()



print(summyValue,minStartDate,maxEndDate)

在终端中我得到了这个:

考虑到最终的预期输出是:

我应该如何使用这些字段的组合?在 for 循环中,我猜我应该包含 Random 1Random 2 列(密钥创建)。另外,为了将所有内容导出到新的 CSV 文件中,for 循环的最佳输出是什么?

【问题讨论】:

  • 为什么忘记添加pandas标签。
  • 如果您以易于使用的格式(而不是图像)提供数据,那么有人会更容易帮助和处理您的数据...
  • @JonClements 我想你这次打败了我发表评论。
  • 没有数据(作为文本)=pandas 社区通常没有帮助。
  • 但是,您的起点应该是df.groupby('ID').agg('Start Date': 'min', 'End Date': 'max', 'Value': 'sum'})...目前还不清楚您希望随机列发生什么...

标签: python pandas csv pandas-groupby


【解决方案1】:

如果您想用最大重复值填充随机 1 和 random2,那么您可以将 agg 与您自己的函数一起使用,例如

df = pd.DataFrame({
    'id': [1,1,1,1,2,2,2],
    'r1': ['x','y','y','y','x','x','x'],
    'r2': ['t','I','t','t','c','c','c']
})

def max_rep(x):
    return x.value_counts().idxmax()

ndf = df.groupby('id',as_index=False).agg({'r1': max_rep,'r2':max_rep})

或者如果你想在一行中使用 lambda

ndf = df.groupby('id',as_index=False).agg({'r1': lambda x: x.value_counts().idxmax(),'r2': lambda x: x.value_counts().idxmax()})

输出:

编号 r1 r2 0 1 岁 1 2 x c

正如 Jon 评论的那样,您可以使用 agg 在一行中完成所有步骤,即

df.groupby('ID',as_index=False).agg('Start Date': 'min', 'End Date': 'max', 'Value': 'sum', \
                 'Random 1':max_rep,'Random 2':max_rep})

如果您希望与 random1 和 random2 一起分组,那么您可以使用

df.groupby(['ID','Random 1','Random 2'],as_index=False).agg('Start Date': 'min', 'End Date': 'max', 'Value': 'sum')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    相关资源
    最近更新 更多