为数据框中的每个组设置列的计算值

时间:2019-07-09 11:38:46

标签: python pandas pandas-groupby

我有一个数据框,我需要按列x进行分组,并将每组中列a的所有值更改为每个组的已计算但恒定的值。

我从这样的数据帧开始:

x     |   a  |   b 
------+------+-----   
a     |  -1  |  ...
b     |  -1  |  ...
c     |  -1  |  ...
a     |  -1  |  ...
b     |  -1  |  ...
c     |  -1  |  ...

,并希望通过按列 x 分组并将列 a 更改为返回函数 f 来将其转换为下面的数据框>

p = ["k", "l"]

def f(group_number, list):    
    return list[group_number % len(list)]

x     |   a               |   b 
------+-------------------+-----   
a     |  f(ngroup(a), p)  |  ...
b     |  f(ngroup(b), p)  |  ...
c     |  f(ngroup(c), p)  |  ...
a     |  f(ngroup(a), p)  |  ...
b     |  f(ngroup(b), p)  |  ...
c     |  f(ngroup(c), p)  |  ...

ngroup 是某些功能,其功能与 pandas.core.groupby.GroupBy.ngroup()的功能完全相同,它会为每个组返回一个数字。

总体结果应该是

x     |  a  |   b 
------+-----+-----   
a     |  k  |  ...
b     |  l  |  ...
c     |  k  |  ...
a     |  k  |  ...
b     |  l  |  ...
c     |  k  |  ...

其中所有带有 a 的条目具有相同的值( k ),所有带有 b 的条目具有的值 l 并且所有带有 c 的值也具有 k

我该如何实现?

1 个答案:

答案 0 :(得分:1)

您想要做的是

df['a'] = p[df.groupby('x').ngroup() % len(p)]  # TypeError here

不幸的是,您不能直接广播到Python列表,因此会引发

TypeError: list indices must be integers or slices, not Series

但是numpy ndarrays允许,所以您可以这样做:

df['a'] = np.array(p)[df.groupby('x').ngroup() % len(p)]