Python熊猫-处理重复项

Python熊猫-处理重复项,python,pandas,Python,Pandas,我想以一种全新的方式处理重复项: 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':[

我想以一种全新的方式处理重复项:

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]})
非常感谢

您可以使用:

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

使用
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

你可以这样做

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()

希望这是你一直在寻找的解决方案

您希望如何构造
D_a
D_c
以从一个五元素列表变成两个三元素列表?那么创建D_a和D_c的规则是什么?我理解删除重复项的理由,但是你希望用D_a和D_c做什么?听起来可能有更好的方法来实现最终目标。如果我们的答案之一有帮助,请投票并接受它。谢谢@路行者啊好!这是常有的事。选民是变化无常的野兽。最好不要让它进入你的皮肤。享受这里的时光,分享你的知识,向他人学习。干杯:-)是的,我同意。顺便说一句,你的回答总是让人印象深刻。我必须说的是一流的python。@RoadRunner谢谢你,我很感激。不过,我还有很长的路要走。但我想我已经到了。关键是要始终保持开放的心态,接受反馈。除了您个人资料中的数字之外,还有更多关于声誉的信息。:-)@toumz干杯,快乐编码!的确令人印象深刻。我要补充一点,这里重要的微妙之处是
clip\u upper
。如果没有此选项,则不会删除重复项。使用pd.DataFrame({'A':[1,1,1,2,1,1],'B':[2,2,1,2,1,1],'C':[2,2,1,1,1,1],'D':[A','C','A','C','C']})这一点更清楚。(简单地重复最后一行)。非常好@乔希-非常感谢你,天气真好!