我有下面的数据帧,并试图使用下面的代码过滤只有在第1、第2、第3和第4列中存在重复记录的行。
df = pd.DataFrame({'col1': ["A", "X", "E", "A", "X", "X"],
'col2': ["B", "Y", "E", "B", "Y","Y"],
'col3': ["C", "Z", "E", "C", "Z", "Z"],
'col4': ["D", "A", "F", "D","A", "A"],
'Sex':["Male","Male","Male","Female","Female","Null",],
'Count':[100,50,100,50,50,10]})
df
:
col1 col2 col3 col4 Sex Count
A B C D Male 100
X Y Z A Male 50
E E E F Male 100
A B C D Female 50
X Y Z A Female 50
X Y Z A Null 10
dup_df = df[df[['col1', 'col2', 'col3',"col4"]].duplicated(keep=False)].sort_values("col1").reset_index(drop=True)
dup_df
:
col1 col2 col3 col4 Sex Count
0 A B C D Male 100
1 A B C D Female 50
2 X Y Z A Male 50
3 X Y Z A Female 50
4 X Y Z A Null 10
过滤重复项并对值进行排序后,数据帧将如上图所示。现在我想做一些算术运算。从第1列到第4列,第0行、第1行和第2、3、4行是相同的,我想通过从与性别列匹配的计数列中获取记录来创建一个新列,比如总男性、总女性和Null。稍后我将删除第1、3、4行的"性"列。执行以下操作后,将得到预期结果。
col1 col2 col3 col4 Sex Count Total Total_Male Total_Female Null_column
0 A B C D Male 100 150 100 50
1 A B C D Female 50
2 X Y Z A Male 50 110 50 50 10
3 X Y Z A Female 50
4 X Y Z A Null 10
有人能帮我找到使用Pandas产生结果的最有效方法吗。我只能考虑使用循环。如有任何帮助,我们将不胜感激。
您可以立即为每个组保留一个值,如下所示:
columns = ['col1', 'col2', 'col3',"col4"]
grouped = dup_df.groupby(columns)
grouped[['Sex', 'Count']].apply(
lambda sub_df: (sub_df.groupby('Sex')
.agg(sum).T
.rename(columns={'Male': 'Total_Male',
'Female': 'Total_Female',
'Null': 'Null_column'}))
).assign(Total=lambda x: x.sum(axis=1))
.reset_index(level=4, drop=True)
.reset_index().rename_axis(columns=None)
)
col1 col2 col3 col4 Total_Female Total_Male Null_column Total
0 A B C D 50 100 NaN 150.0
1 X Y Z A 50 50 10.0 110.0