【问题标题】:create new column using a shift within a groupby values使用 groupby 值中的移位创建新列
【发布时间】:2017-12-08 10:12:30
【问题描述】:

我想创建一个新列,它是应用于分组值的移位函数的结果。

df = pd.DataFrame({'X': [0,1,0,1,0,1,0,1], 'Y':[2,4,3,1,2,3,4,5]})

df

   X  Y
0  0  2
1  1  4
2  0  3
3  1  1
4  0  2
5  1  3
6  0  4
7  1  5

def func(x):                                                           
     x['Z'] = test['Y']-test['Y'].shift(1)
     return x

df_new = df.groupby('X').apply(func)

   X  Y    Z
0  0  2  NaN
1  1  4  2.0
2  0  3 -1.0
3  1  1 -2.0
4  0  2  1.0
5  1  3  1.0
6  0  4  1.0
7  1  5  1.0

从输出中可以看出,这些值是按顺序移动的,而不考虑分组依据。

我看到了一个类似的问题,但我不明白为什么它不能按预期工作。

Python Pandas: how to add a totally new column to a data frame inside of a groupby/transform operation

【问题讨论】:

    标签: pandas


    【解决方案1】:

    值在不考虑组的情况下移动,因为您的func 直接使用test(可能是其他对象,可能是您称为df 的另一个名称)而不是简单的组x

    def func(x):                                                           
        x['Z'] = x['Y']-x['Y'].shift(1)
        return x
    

    给我

    In [8]: df_new
    Out[8]: 
       X  Y    Z
    0  0  2  NaN
    1  1  4  NaN
    2  0  3  1.0
    3  1  1 -3.0
    4  0  2 -1.0
    5  1  3  2.0
    6  0  4  2.0
    7  1  5  2.0
    

    但请注意,在这种特殊情况下,您不需要编写自定义函数,您可以直接在 groupby 对象上调用 diff。 (当然,您可能想要使用的其他功能可能更复杂)。

    In [13]: df_new["Z2"] = df.groupby("X")["Y"].diff()
    
    In [14]: df_new
    Out[14]: 
       X  Y    Z   Z2
    0  0  2  NaN  NaN
    1  1  4  NaN  NaN
    2  0  3  1.0  1.0
    3  1  1 -3.0 -3.0
    4  0  2 -1.0 -1.0
    5  1  3  2.0  2.0
    6  0  4  2.0  2.0
    7  1  5  2.0  2.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-17
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      相关资源
      最近更新 更多