提问人:Naresh Ambati 提问时间:6/4/2017 最后编辑:Timur ShtatlandNaresh Ambati 更新时间:11/18/2023 访问量:32594
Pandas groupby 自定义功能到每个系列
Pandas groupby custom function to each series
问:
我很难将自定义函数应用于 Pandas 中的每组列groupby
我的自定义函数接受一系列数字,并取连续对的差值,并返回所有差值的平均值。代码如下:
def mean_gap(a):
b = []
for i in range(0, len(a)-1):
b.append((a[i+1]-a[i]))
return np.mean(b)
所以如果,会给我a = [1,3,7]
mean_gap(a)
((3-1)+(7-3))/2) = 3.0
Dataframe:
one two
a 1
a 3
a 7
b 8
b 9
期望的结果:
Dataframe:
one two
a 3
b 1
df.groupby(['one'])['two'].???
我是熊猫的新手。我读到一次每行取值,而不是整个系列。所以我不能在 .groupby
groupby
答:
25赞
ayhan
6/4/2017
#1
使用自定义函数,您可以执行以下操作:
df.groupby('one')['two'].agg(lambda x: x.diff().mean())
one
a 3
b 1
Name: two, dtype: int64
并重置索引:
df.groupby('one')['two'].agg(lambda x: x.diff().mean()).reset_index(name='two')
one two
0 a 3
1 b 1
另一种选择是:
df.groupby('one')['two'].diff().groupby(df['one']).mean()
one
a 3.0
b 1.0
Name: two, dtype: float64
您的方法也适用于以下方法:
def mean_gap(a):
b = []
a = np.asarray(a)
for i in range(0, len(a)-1):
b.append((a[i+1]-a[i]))
return np.mean(b)
df.groupby('one')['two'].agg(mean_gap)
one
a 3
b 1
Name: two, dtype: int64
a = np.asarray(a)
是必需的,否则您将在 中得到 KeyErrors。b.append((a[i+1]-a[i]))
评论
0赞
Naresh Ambati
6/4/2017
谢谢ayhan!快速问题:如果我只执行这部分“df.groupby('one')['two'].diff()”,它不会显示列'one'。输出仅显示索引和值。为什么?我知道显示“一”是没有意义的,因为每对都显示了差异。diff() 函数的属性是不显示“一个”:)
0赞
ayhan
6/4/2017
像 这样的方法在对 groupby 对象调用时不会返回聚合结果。例如,如果在示例中执行,则结果将只有行 a 和 b,但 for 和 结果将有 5 行 - 与原始 DataFrame 相同。由于没有聚合,我们通常使用它们来分配回原始 DataFrame。这可能就是分组列未显示在返回对象中的原因。diff
cumsum
groupby.sum
diff
cumsum
0赞
Naresh Ambati
6/4/2017
听起来很合乎逻辑。非常感谢:)
评论