我想处理pandas df中的重复:
df=pd.DataFrame({'A':[1,1,1,2,1],'B':[2,2,1,2,1],'C':[2,2,1,1,1],'D':['a','c','a','c','c']})
df
我想只保留具有A,B,C唯一值的行创建二进制列D_a和D_c,所以结果将是这样的,而不是在每行上做超慢循环..
result= pd.DataFrame({'A':[1,1,2],'B':[2,1,2],'C':[2,1,1],'D_a':[1,1,0],'D_c':[1,1,1]})
非常感谢
答案 0 :(得分:3)
您可以使用:
df1 = (df.groupby(['A','B','C'])['D']
.value_counts()
.unstack(fill_value=0)
.add_prefix('D_')
.clip_upper(1)
.reset_index()
.rename_axis(None, axis=1))
print (df1)
A B C D_a D_c
0 1 1 1 1 1
1 1 2 2 1 1
2 2 2 1 0 1
答案 1 :(得分:2)
使用get_dummies
+ sum
-
df = df.set_index(['A', 'B', 'C'])\
.D.str.get_dummies()\
.sum(level=[0, 1, 2])\
.add_prefix('D_')\
.reset_index()
df
A B C D_a D_c
0 1 1 1 1 1
1 1 2 2 1 1
2 2 2 1 0 1
答案 2 :(得分:2)
你可以做这样的事情
df.loc[df['D']=='a', 'D_a'] = 1
df.loc[df['D']=='c', 'D_c'] = 1
这将在新列中放置1,其中每个“a”或“c”出现。
A B C D D_a D_c
0 1 2 2 a 1.0 NaN
1 1 2 2 c NaN 1.0
2 1 1 1 a 1.0 NaN
3 2 2 1 c NaN 1.0
4 1 1 1 c NaN 1.0
但是你必须用0替换NaN。
df = df.fillna(0)
接下来,您只需选择所需的列,然后删除重复项。
df = df[["A","B","C", "D_a", "D_c"]].drop_duplicates()
希望这是您正在寻找的解决方案。