gpt4 book ai didi

python - Pandas groupby中的条件分配

转载 作者:行者123 更新时间:2023-12-01 21:38:50 25 4
gpt4 key购买 nike

假设我在下面有df:

df = pd.DataFrame({
'ID': ['a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd'],
'V': np.array(range(0,10))
})

我想groupby ID 变量并将值分配给新列X,具体取决于 (1) 每个组的大小和每行是顶部 (T)、“中间”(更像是在顶部和底部之间)(M) 还是底部 (B ) 排。如果一组中只有一行,则分配的值为 N。在这种情况下,结果将如下所示:

    ID  V   X
0 a 0 N
1 b 1 T
2 b 2 B
3 c 3 T
4 c 4 M
5 c 5 B
6 d 6 T
7 d 7 M
8 d 8 M
9 d 9 B

我可以使用类似的方法(对于 T 情况)逐步执行此操作:

df.join(df.groupby('ID').filter(lambda x: len(x)>1).groupby('ID').head(1).assign(X='T').X, how='left')

但这感觉像是一个糟糕的解决方案。我宁愿一次性完成所有工作。有什么想法吗?

最佳答案

从您的逻辑来看,这是直截了当的:

groups = df.groupby('ID')
first = groups['V'].head(1).index
last = groups['V'].tail(1).index

# the default middle values
df['X'] = 'M'

# the top and bottom values
df.loc[first, 'X'] = 'T'
df.loc[last, 'X'] = 'B'

# the unique values
ones = groups['V'].transform('size') == 1
df.loc[ones, 'X'] = 'N'

输出:

  ID  V  X
0 a 0 N
1 b 1 T
2 b 2 B
3 c 3 T
4 c 4 M
5 c 5 B
6 d 6 T
7 d 7 M
8 d 8 M
9 d 9 B

关于python - Pandas groupby中的条件分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61593358/

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