【问题标题】:How to shift entire groups in pandas groupby如何在熊猫 groupby 中移动整个组
【发布时间】:2015-02-02 23:43:16
【问题描述】:

给定以下数据:

data = {'a' : [1,1,1,8,8,3,3,3,3,4,4] }
df = pd.DataFrame(data)

我现在想将整个内容向下移动 n 个,以便保留它们当前的顺序。 n=1 移位的期望输出是:

desired_output = {'a': [NaN,NaN,NaN,1,1,8,8,8,8,3,3] }
desired_output_df = pd.DataFrame(desired_output)

n=2 的移位应该是:

desired_output = {'a': [NaN,NaN,NaN,NaN,NaN,1,1,1,1,8,8] }
desired_output_df = pd.DataFrame(desired_output)

我一直在搞乱 groupby/transform/apply,但到目前为止还没有任何工作。如果我分组然后移位,它会移动每个组,给出以下输出:

NOT_desired_output = {'a' : [NaN, 1, 1, NaN, 8, NaN, 3,3,3, NaN, 4]}

我可以通过迭代来强制它,但我确信有更好的解决方案。有什么想法吗?

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    这是一个有趣的操作。我可以用replace 想到另一种方法。

    移动 1 组:

    >>> df['b'] = df.a.shift()
    >>> x = df[df.a != df.b]
    >>> df.replace(*x.values.T)
    

    这给出了DataFrame:

         a   b
    0  NaN NaN
    1  NaN NaN
    2  NaN NaN
    3    1 NaN
    4    1   1
    5    8   1
    6    8   8
    7    8   8
    8    8   8
    9    3   8
    10   3   3
    

    我们只想要这个DataFrame的a列:

    desired_output_df = pd.DataFrame(_, columns=['a'])
    

    要移动多个组,您只需移动b 的列x。如果要按n 组移动,则需要将x.b 移动额外n-1 次。只需插入行

    >>> x.b = x.b.shift(n-1)
    

    x = df[df.a != df.b] 之后执行df.replace(*x.values.T) 步骤。

    【讨论】:

    • 有趣——我想看看这是否适用于多次转换并更新问题以包含该问题
    • 啊太棒了-我仍在努力了解它的工作原理,但它显然确实有效!
    • (*x.values.T) 是按列对 NumPy 数组进行元组解包(请参阅this 答案以获得解释)。它基本上使用列 ab 来查找/替换列表。
    猜你喜欢
    • 2019-03-21
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2016-10-31
    相关资源
    最近更新 更多