pandas中的groupby和移除配对记录[英] groupby and remove pair records in pandas

本文是小编为大家收集整理的关于pandas中的groupby和移除配对记录的处理方法,想解了pandas中的groupby和移除配对记录的问题怎么解决?pandas中的groupby和移除配对记录问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个这样的数据框,

col1    col2    col3    col4
a1      b1      c1      +
a1      b1      c1      +
a1      b2      c2      +
a1      b2      c2      -
a1      b2      c2      +

如果 col1、col2 和 col3 中存在两个值相同且 col4 中符号相反的记录,则应将它们从数据框中删除.

输出:

col1    col2    col3    col4
a1      b1      c1      +
a1      b1      c1      +
a1      b2      c2      +

到目前为止,我尝试了 pandas duplicated 和 groupby 但没有成功找到对.如何做到这一点?

解决方案

我觉得需要cumcount 用于计数组定义所有 4 列,然后使用辅助 Series 再次 groupby 定义 +- 组并与 set 进行比较:

s = df.groupby(['col1','col2','col3', 'col4']).cumcount()
df = df[~df.groupby(['col1','col2','col3', s])['col4']
           .transform(lambda x: set(x) == set(['+','-']))]
print (df)
  col1 col2 col3 col4
0   a1   b1   c1    +
1   a1   b1   c1    +
6   a1   b2   c2    +

为了更好地理解创建新列:

df['help'] = df.groupby(['col1','col2','col3', 'col4']).cumcount()
print (df)
  col1 col2 col3 col4  help
0   a1   b1   c1    +     0
1   a1   b1   c1    +     1
2   a1   b2   c2    +     0
3   a1   b2   c2    -     0
4   a1   b2   c2    +     1

df = df[~df.groupby(['col1','col2','col3', 'help'])['col4']
           .transform(lambda x: set(x) == set(['+','-']))]
print (df)
  col1 col2 col3 col4  help
0   a1   b1   c1    +     0
1   a1   b1   c1    +     1
4   a1   b2   c2    +     1

本文地址:https://www.itbaoku.cn/post/1727757.html