gpt4 book ai didi

python Pandas : groupby apply function looks at prior rows

转载 作者:行者123 更新时间:2023-12-01 05:08:15 26 4
gpt4 key购买 nike

我有一个数据集,我想添加一列来表示某些计算的结果(很复杂)。计算需要在每个组中完成,并且每个行值都依赖于其上方的行。这是我到目前为止的代码和所需输出的简单示例:

编辑 1所以我更新了下面的代码,也许我不明白 apply 是如何工作的,但我认为这会执行两次(每个组一次)。然后,我的函数将循环这些执行中的每一行。我仍然很困惑为什么它会打印 3 次......我以为“execute”会打印 5 次。对此有何想法?

编辑2我的返回函数的缩进错误。这解决了它。感谢您的帮助!

import pandas as pd

df = pd.DataFrame({'type' : ['foo', 'foo', 'foo', 'bar','bar'], 'cost' : [1, 4, 2, 8,9]})
df['class'] = np.nan

def customFunction(test_df):
print np.shape(test_df)
iteration = 1
for currRow in test_df.iterrows():
print 'executed'
if iteration == 1:
test_df['class'] = 'first'
else:
if currRow[1]['cost'] > priorCost:
test_df['class'] = 'greater'
elif currRow[1]['cost'] < priorCost:
test_df['class'] = 'less'
else:
test_df['class'] = 'equal'

iteration += 1
priorCost = currRow[1]['cost']

return test_df

grouped_df = df.groupby(['type']).apply(customFunction)

输出:

(2, 2)
executed
(2, 2)
executed
(3, 2)
executed
cost type class
0 1 foo first
1 4 foo first
2 2 foo first
3 8 bar first
4 9 bar first

最佳答案

我会尽可能地告诉你 - 我现在需要短暂的休息,但是:

df = pd.DataFrame(pd.read_clipboard())
df.set_index('type', inplace=True)
test = df.groupby(level=0).apply(lambda x: x.cost.diff())

给我(因为 diff() 计算列与第一个条目之间的差异)

Out[160]: 
type
bar type
bar NaN
bar 1
Name: cost, dtype: ...
foo type
foo NaN
foo 3
foo -2
Name: co...
dtype: object

这包含了您需要的所有信息。目前,我正在努力将这些信息合并回原始数据帧。 df['differences'] = test 造成了巨大的困惑。

更新

我快到了:

>>> df['differences'] = test[1].append(test[0])
>>> df.loc[df['differences'] > 0, 'inWords'] = 'greater'
>>> df.loc[df['differences'] < 0, 'inWords'] = 'lesser'
>>> df.loc[df['differences'].isnull(), 'inWords'] = 'first'
>>> df
Out[184]:
cost differences inWords
type
foo 1 NaN first
foo 4 3 greater
foo 2 -2 lesser
bar 8 NaN first
bar 9 1 greater

因此,唯一需要的是通用表达式,而不是 test[1].append(test[0])。也许其他人可以在这里帮忙?

更新2

回应您的评论:每当您为 apply() 定义函数时,如

def compareSomethingWithinAGroup(group):
someMagicHappens()
return someValues

您可以访问所有标准 pandas 函数以及函数内的整个组。因此,您可以创建所有复杂的行相关魔法,无论它是什么。您唯一需要注意的是:someValues 需要是只有一列的 Seriesdataframe,其条目数量为有行。只要你返回这样的someValues,你就可以df['resultOfSomethingComplicated'] = df.groupby(level=0).apply(compareSomethingWithinAGroup),并使用all您的回复中的行。

关于 python Pandas : groupby apply function looks at prior rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24681272/

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