首页 > 解决方案 > 熊猫根据条件按行选择分组

问题描述

我需要根据条件选择 pandas 组中的行。

输入数据框

    R1  R2  W   TYPE amount1 amount2 Status Exchange
0   123 12  1   A   111      222         C      1.5
1   123 12  1   B   111      222         D      2.5
2   123 12  2   A   222      222         A      1.5
3   123 12  2   B   333      333         D      2.5
4   123 12  3   A   444      444         D      2.5
5   123 12  3   B   333      333         E      3.5

预期产出

    R1  R2  W   TYPE amount1 amount2 Status Exchange
0   123 12  1   A   111      222         C      1.5
1   123 12  2   A   555      555         A      1.5
2   123 12  3   A   777      777         D      2.5

标签: pythonpandas

解决方案


首先是必须通过 reshape with and来获取所有amount1相等的组,通过with and比较选定的列以测试是否使用了所有列匹配,最后使用与原始相同的长度:amount2DataFrame.set_indexDataFrame.unstackDataFrame.xsDataFrame.eqDataFrame.allDataFrame.merge

df1 = df.set_index(['R1','R2','W','TYPE'])['amount2'].unstack()
m = df1['A'].eq(df1['B']).rename('m')
m = df.join(m, on=['R1','R2','W'])['m']

然后对于匹配行(这里是第一组)boolean indexing仅按位A链接的行过滤:&AND

df2 = df[m & df['TYPE'].eq('A')]
print (df2)
    R1  R2  W TYPE  amount1  amount2 Status  Exchange
0  123  12  1    A      111      222      C       1.5

然后通过反转掩码过滤所有其他组,并按所有列~聚合和列:GroupBy.aggGroupBy.firstamountsum

cols = df.columns.difference(['R1','R2','W','amount1','amount2'])
d1 = dict.fromkeys(['amount1','amount2'], 'sum')
d2 = dict.fromkeys(cols, 'first')

df3 = df[~m].groupby(['R1','R2','W'], as_index=False).agg({**d1, **d2}).assign(TYPE='A')
print (df3)
    R1  R2  W  amount1  amount2  Exchange Status TYPE
0  123  12  2      555      555       1.5      A    A
1  123  12  3      777      777       2.5      D    A

最后加入concat,如有必要,按以下方式排序DataFrame.sort_values

df4 = pd.concat([df2, df3], ignore_index=True, sort=False).sort_values(['R1','R2','W'])
print (df4)
    R1  R2  W TYPE  amount1  amount2 Status  Exchange
0  123  12  1    A      111      222      C       1.5
1  123  12  2    A      555      555      A       1.5
2  123  12  3    A      777      777      D       2.5

推荐阅读