我正在使用熊猫探索具有多个重复条目的数据集。例如:
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。但是,我认为这不是正确的方法,因为我看不到这些按行操作对一组重复项起作用的方法。
答案 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