gpt4 book ai didi

python - Pandas:以不同的方式对每一列进行分组

转载 作者:行者123 更新时间:2023-12-01 01:16:23 26 4
gpt4 key购买 nike

假设我有以下数据框:

df = pd.DataFrame({"unique_id": [1, 1, 1], "att1_amr": [11, 11, 11], "att2_nominal": [1, np.nan, np.nan], "att3_nominal": [np.nan, 1, np.nan], "att4_bok": [33.33, 33.33, 33.33], "att5_nominal": [np.nan, np.nan, np.nan], "att6_zpq": [22.22, 22.22, 22.22]})

我想要做的是按 unique_id 对数据帧的行进行分组,这样我就可以对包含单词 nominal 的列应用单独的分组操作 并与所有其他分开。更具体地说,我想使用 sum(min_count = 1) 对包含 nominal 的列进行分组,并使用 first() 对包含其他列进行分组> 或last()。结果应该如下:

df_result = pd.DataFrame({"unique_id": [1], "att1_amr": [11], "att2_nominal": [1], "att3_nominal": [1], "att4_bok": [33.33], "att5_nominal": [np.nan], "att6_zpq": [22.22]})

谢谢!

最佳答案

您可以动态创建字典 - 首先使用 lambda 函数使用 nominal 的所有列,然后使用 last 的所有其他列并将其合并在一起,最后调用 DataFrameGroupBy.agg :

d1 = dict.fromkeys(df.columns[df.columns.str.contains('nominal')], 
lambda x : x.sum(min_count=1))

d2 = dict.fromkeys(df.columns.difference(['unique_id'] + list(d1)), 'last')
d = {**d1, **d2}

df = df.groupby('unique_id').agg(d)
print (df)
att2_nominal att3_nominal att5_nominal att1_amr att4_bok \
unique_id
1 1.0 1.0 NaN 11 33.33

att6_zpq
unique_id
1 22.22

另一个更清洁的解决方案:

d = {k: (lambda x : x.sum(min_count=1)) 
if 'nominal' in k
else 'last'
for k in df.columns.difference(['unique_id'])}

df = df.groupby('unique_id').agg(d)
print (df)
att1_amr att2_nominal att3_nominal att4_bok att5_nominal \
unique_id
1 11 1.0 1.0 33.33 NaN

att6_zpq
unique_id
1 22.22

关于python - Pandas:以不同的方式对每一列进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54307674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com