python - Pandas 按条件分组

标签 python pandas group-by

这是我的数据 -

FROM    TO  DIRECTION    AMOUNT  
B    A    IN    100
A    B    OUT    200
A    B    IN    300
B    A    OUT    40

作为输出,我想显示谁总共支付了谁的摘要 -

FROM    TO    AMOUNT
A    B    300
B    A    340

澄清一下,如果 A --> B 是第 2 行和第 1 行(IN 表示从 TO 传输到 FROMOUT表示从FROM传输到TO)

我在使用 .groupby() 方式时遇到问题。我尝试过的 -

df.groupby(['FROM', 'TO', 'DIRECTION'])

但这当然似乎并不能解决问题。任何帮助表示赞赏。

最佳答案

Idea 是按条件交换 FROMTO 的值:

mask = df['DIRECTION'] == 'IN'
df.loc[mask, ['TO', 'FROM']] = df.loc[mask, ['FROM', 'TO']].values
print (df)
  FROM TO DIRECTION  AMOUNT
0    A  B        IN     100
1    A  B       OUT     200
2    B  A        IN     300
3    B  A       OUT      40

然后聚合sum:

df = df.groupby(['FROM', 'TO'], as_index=False)['AMOUNT'].sum()
print (df)
  FROM TO  AMOUNT
0    A  B     300
1    B  A     340

如果不想修改原始DataFrame,则解决方案非常相似:

mask = df['DIRECTION'] == 'IN'
df1 = df[['TO','FROM']].mask(mask, df[['FROM','TO']].values)
#output is same like above, only changed order of columns
print (df1)
  TO FROM
0  B    A
1  B    A
2  A    B
3  A    B

df2 = df['AMOUNT'].groupby([df1['FROM'], df1['TO']]).sum().reset_index()
print (df2)
  FROM TO  AMOUNT
0    A  B     300
1    B  A     340

关于python - Pandas 按条件分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51593268/

相关文章:

python - 以不寻常的方式对 Pandas 数据框进行分组

mysql - 如何编写SQL来返回连接数据出现的次数?

mysql - 如何使用 group_concat 合并 2 个单独的查询并按特定字段分组

python - 如何在 Python 中填充二维数组?

python - 如何通过删除输出和转换来对 .ipynb 进行版本控制?

python - 按日期对行进行分组并覆盖 NaN 值

python - 使用 Pandas 将字符串格式化为日期时间 - 指令有问题

python - 在 SQLalchemy 中,我可以有一个包含多个字符串的列吗?

python - 使用flask通过一个查询将数据插入到多个mySQL表中

C# Linq GroupBy 方法对于匿名类型和非匿名类型的工作方式不同