我有一个数据框,我需要按列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 。
我该如何实现?
答案 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)]