python:groupbyapply函数查看前面的行

python:groupbyapply函数查看前面的行,python,pandas,Python,Pandas,我有一个数据集,我想添加一列来表示某些计算的结果(它很复杂)。计算需要在每个组中进行,并且每一行的值取决于它上面的行。下面是一个简单的示例,说明我到目前为止的代码和所需的输出: 编辑1 所以我在下面更新了我的代码,也许我不了解apply是如何工作的,但我认为这会执行两次(每个组一次)。然后,我的函数将循环这些执行中的每一行。我仍然不明白为什么它会打印3次……我以为“执行”会打印5次。对此有何想法 编辑2 我的返回函数的缩进错误。这就解决了问题。谢谢你的帮助 import pandas as pd

我有一个数据集,我想添加一列来表示某些计算的结果(它很复杂)。计算需要在每个组中进行,并且每一行的值取决于它上面的行。下面是一个简单的示例,说明我到目前为止的代码和所需的输出:

编辑1 所以我在下面更新了我的代码,也许我不了解apply是如何工作的,但我认为这会执行两次(每个组一次)。然后,我的函数将循环这些执行中的每一行。我仍然不明白为什么它会打印3次……我以为“执行”会打印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)

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

df = pd.DataFrame(pd.read_clipboard())
df.set_index('type', inplace=True)
test = df.groupby(level=0).apply(lambda x: x.cost.diff())
给我(因为
diff()
计算列内的差异w.r.t.第一个条目)

这包含了你需要的所有信息。目前,我正在努力将这些信息合并回原始数据帧
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

您可以访问所有标准函数以及函数中的整个组。所以,你可以创建所有复杂的依赖行的魔法,不管它是什么。唯一需要注意的是:
someValues
需要是一个只有一列的
系列
数据帧
,它的条目数与
组的行数相同。只要您返回这样的
someValues
,您就可以始终执行
df['resultofsomethingcomplexed']=df.groupby(level=0)。apply(compareSomethingWithinAGroup)
,并使用响应中的所有行。

谢谢您的帮助,但我正在进行的实际计算是不同的,而且要复杂得多(我刚刚发布了一个例子——如果您可以计算相对于x-1行的x行,我可以将其转换为我实际需要做的事情)。我需要找出如何比较行,而不是执行上面示例中的实际步骤。我更新了我的响应。希望这有帮助吗?否则,如果您需要帮助,了解
apply()中应该发生的事情
function,您需要更具体地说明您到底想做什么。谢谢-我更新了上面的代码,我仍然不完全理解为什么结果不如预期。。。
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[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
def compareSomethingWithinAGroup(group):
    someMagicHappens()
    return someValues