我有一个数据框如下:
df
id val
0 1 21
1 2 35
2 2 45
3 3 55
4 1 10
5 4 90
6 3 45
7 2 78
8 3 23
我想根据 id 中每个值的长度创建一个新列 cat。
如果 len(id) <= 1 cat 中的值应该是 'A'
如果 len(id) < 3 值应该是 'B'
如果 len(id) >= 3 值应该是 'C'
预期输出:
id val cat
0 1 21 B
1 2 35 C
2 2 45 C
3 3 55 C
4 1 10 B
5 4 90 A
6 3 45 C
7 2 78 C
8 3 23 C
我尝试过的:
def test(series):
if len(series) <= 1:
return 'A'
elif len(series) < 3:
return 'B'
else:
return 'C'
df.groupby('id').apply(test)
以上代码错误:
TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed
请您参考如下方法:
您可以使用map、value_counts 和pd.cut:
df['cat'] = df.id.map(pd.cut(df.id.value_counts(),
bins=[0,1,2,np.inf],
labels=['A','B','C']))
输出:
id val cat
0 1 21 B
1 2 35 C
2 2 45 C
3 3 55 C
4 1 10 B
5 4 90 A
6 3 45 C
7 2 78 C
8 3 23 C
