gpt4 book ai didi

python - 使用 groupby 后更新应用内的数据框

转载 作者:太空宇宙 更新时间:2023-11-04 05:07:45 28 4
gpt4 key购买 nike

我有一个 pandas 数据框,我想对其进行分组,然后使用 iterrowsset_value 更新原始数据框。这似乎不起作用。

这是一个例子。

In [1]: def func(df, n):
...: for i, row in df.iterrows():
...: print("Updating {0} with value {1}".format(i, n))
...: df.set_value(i, 'B', n)

In [2]: df = pd.DataFrame({"A": [1, 2], "B": [0, 0]})

In [3]: df
Out[4]:
A B
0 1 0
1 2 0

In [125]: func(df, 1)
Updating 0 with value 1
Updating 1 with value 1

In [126]: df
Out[126]:
A B
0 1 1
1 2 1

In [127]: df.groupby('A').apply(lambda df: func(df, 2))
Updating 0 with value 2
Updating 0 with value 2
Updating 1 with value 2
In [126]: df
Out[126]:
A B
0 1 1
1 2 1

我希望 B 会更新为 2

为什么这不起作用,实现该结果的最佳方法是什么?

最佳答案

按照你写东西的方式,你似乎想要函数 func(df, n)修改df到位。但是df.groupby('A') (在某种意义上)创建另一组数据框(每组一个),因此使用 func()作为 df.groupby('A').apply() 的参数只修改这些新创建的数据框而不是原始的 df .此外,返回的数据帧是 func() 输出的串联将每个组作为参数调用,这就是返回的数据框为空的原因。

解决问题的最短方法是 return dffunc 的末尾:

def func(df, n):
for i, row in df.iterrows():
print("Updating {0} with value {1}".format(i, n))
df.set_value(i, 'B', n)
return df
df = df.groupby('A').apply(lambda df: func(df, 2))

我想这并不是您的初衷,因为您可能希望修改所有内容。如果您打算就地修改所有内容,则需要使用 for 的组合循环和 .loc ,但使用 .loc 修改您的数据框如果您打算调用 .loc,计算量会很大很多次。

我还猜测您设置值的函数取决于更复杂的标准,但通常您可以对事物进行矢量化并避免使用 .iterrows()完全。

为了避免 XY 问题,我建议更详细地描述您的函数,因为很可能您可以通过结合使用 .loc 的几行代码来完成所有事情。并避免需要遍历 Python 中的每一行。恰当的例子:df['B'] = 2 (没有 print 声明)是您问题的单线解决方案。

关于python - 使用 groupby 后更新应用内的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43926479/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com