所以,我有一个问题,我认为这是相对容易的。
我有一个有三列的dataframe:
A B C
x1 a 2
x1 a 2
x1 b 3
x1 c 4
x1 c 4
x2 d 2
x2 d 2
x3 e 5
x3 e 5现在,如果我想现在对A的每一组(x1,x2,x3),在C中大于2的B中有多少唯一值,并将其赋值给一个新列D,它将返回以下内容
A B C D
x1 a 2 2
x1 a 2 2
x1 b 3 2
x1 c 4 2
x1 c 4 2
x2 d 2 0
x2 d 2 0
x3 e 5 1
x3 e 5 1在不使用for循环的情况下,我应该如何在Pandas中实现这一点?这个是可能的吗?
发布于 2017-05-06 15:53:19
用map + groupby + apply + nunique解决方案
df['D'] = df['A'].map(df.groupby('A').apply(lambda x: x.loc[x.C > 2, 'B'].nunique()))
print (df)
A B C D
0 x1 a 2 2
1 x1 a 2 2
2 x1 b 3 2
3 x1 c 4 2
4 x1 c 4 2
5 x2 d 2 0
6 x2 d 2 0
7 x3 e 5 1
8 x3 e 5 1用map + query + groupby + nunique + fillna + astype解决方案
df['D'] = df['A'].map(df.query('C > 2').groupby('A')['B'].nunique()).fillna(0).astype(int)
print (df)
A B C D
0 x1 a 2 2
1 x1 a 2 2
2 x1 b 3 2
3 x1 c 4 2
4 x1 c 4 2
5 x2 d 2 0
6 x2 d 2 0
7 x3 e 5 1
8 x3 e 5 1发布于 2017-05-06 15:45:49
您可以首先基于列C进行筛选,然后使用groupby.nunique。由此产生的系列可用作映射:
df['D'] = df['A'].map(df[df['C']>2].groupby('A')['B'].nunique()).fillna(0)
df
Out:
A B C D
0 x1 a 2 2.0
1 x1 a 2 2.0
2 x1 b 3 2.0
3 x1 c 4 2.0
4 x1 c 4 2.0
5 x2 d 2 0.0
6 x2 d 2 0.0
7 x3 e 5 1.0
8 x3 e 5 1.0https://stackoverflow.com/questions/43822288
复制相似问题