【问题标题】:How to aggregate across columns in pandas?如何在熊猫中跨列聚合?
【发布时间】:2019-03-22 12:04:02
【问题描述】:

有 5 个成员为每个 [E,M,S] 贡献某物的价值,如下所示:

E,M,S,Mem1,Mem2,Mem3,Mem4,Mem5
1,365,-10,15,21,18,16,,
1,365,10,23,34,,45,65
365,365,-20,34,45,43,32,23
365,365,20,56,45,,32,38
730,365,-5,82,64,13,63,27
730,365,15,24,68,,79,78

请注意,缺少贡献 ,,.我想知道每个 [E,M,S] 的贡献数量。为此,例如输出是:

1,365,-10,4
1,365,10,4
365,365,-20,5
365,365,20,4
730,365,-5,5
730,365,15,4

groupingBy['E','M','S'] 然后聚合(计数)或应用(函数)但跨轴 = 1 会这样做。这是如何完成的?或者任何其他惯用的方式来做到这一点?

【问题讨论】:

  • df.iloc[:,3:].notna().sum(1)
  • AttributeError: 'DataFrame' 对象没有属性 'notna'
  • @astro123 听起来您使用的是旧版本的 Pandas 并且 .isna() 没有在那里实现 - 有关相关问题,请参阅 123。您可能必须使用.notnull 而不是.notna

标签: pandas aggregation


【解决方案1】:

@Wen 发布的答案非常棒,而且绝对是最简单的方法。

如果您想要其他方式来执行此操作,则可以使用.melt 查看 DF 中的组。然后,在熔化的 DF 中的每个组内使用 groupby.sum() 聚合。您只需要在聚合时忽略NaNs,一种方法是遵循应用于组的SO post - .notnull() 中的方法。

输入 DF

print df
     E    M   S  Mem1  Mem2  Mem3  Mem4  Mem5
0    1  365 -10    15    21  18.0    16   NaN
1    1  365  10    23    34   NaN    45  65.0
2  365  365 -20    34    45  43.0    32  23.0
3  365  365  20    56    45   NaN    32  38.0
4  730  365  -5    82    64  13.0    63  27.0
5  730  365  15    24    68   NaN    79  78.0

方法如下

# Apply melt to view groups
dfm = pd.melt(df, id_vars=['E','M','S'])
print(dfm.head(10))
     E    M   S variable  value
0    1  365 -10     Mem1   15.0
1    1  365  10     Mem1   23.0
2  365  365 -20     Mem1   34.0
3  365  365  20     Mem1   56.0
4  730  365  -5     Mem1   82.0
5  730  365  15     Mem1   24.0
6    1  365 -10     Mem2   21.0
7    1  365  10     Mem2   34.0
8  365  365 -20     Mem2   45.0
9  365  365  20     Mem2   45.0

# GROUP BY
grouped = dfm.groupby(['E','M','S'])

# Aggregate within each group, while ignoring NaNs
gtotals = grouped['value'].apply(lambda x: x.notnull().sum())

# (Optional) Reset grouped DF index
gtotals = gtotals.reset_index(drop=False)
print(gtotals)
     E    M   S  value
0    1  365 -10      4
1    1  365  10      4
2  365  365 -20      5
3  365  365  20      4
4  730  365  -5      5
5  730  365  15      4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多