如何根据复杂的列条件集合重复的行

时间:2019-02-03 13:03:58

标签: python pandas dataframe pandas-groupby

我正在使用熊猫探索具有多个重复条目的数据集。例如:

import pandas as pd
pd.DataFrame({'ID':['001','001','002','002','002','003','003','004','004'],
             'a':['Yes','Yes','Yes','No','Yes','Yes','No','No','No'],
             'b':['NaN',3,'NaN',5,4,7,'NaN','NaN','NaN']})

ID  a   b
001 Yes NaN
001 Yes 3
002 Yes NaN
002 No  5
002 Yes 4
003 Yes 7
003 No  NaN
004 No  NaN
004 No  NaN

每个重复的ID应该合并为一行,其中列的值将根据以下规则进行汇总:

  • 如果出现在该列中,则Yes应该取代No

  • 如果该列中有数字,则应替换NaN,如果存在多个数字,则应选择最大的数字。

预期结果是:

ID  a   b
001 Yes 3
002 Yes 5
003 Yes 7
004 No  NaN

我尝试过(但失败了)创建一个自定义函数,然后使用apply和lambda。但是,我认为这不是正确的方法,因为我看不到这些按行操作对一组重复项起作用的方法。

1 个答案:

答案 0 :(得分:2)

在将groupby字符串替换为max之后,可以使用'NaN' + np.nan。这工作特别是因为'Yes' > 'No'返回True。为了提高效率,建议您将序列a转换为分类序列或布尔序列。

# replace 'NaN' strings with np.nan
df['b'] = df['b'].replace('NaN', np.nan)

# groupby + max, reset index to elevate index to column
res = df.groupby('ID').max().reset_index()

print(res)

    ID    a    b
0  001  Yes  3.0
1  002  Yes  5.0
2  003  Yes  7.0
3  004   No  NaN