使用panda过滤数据帧中的重复记录并执行操作



我有下面的数据帧,并试图使用下面的代码过滤只有在第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

最新更新