假设我在下面有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/