如何在pandas groupby中移动整个组

时间:2014-12-04 22:12:47

标签: python pandas dataframe pandas-groupby

鉴于以下数据:

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

我现在想用n groups 来改变整个事情,以便保留他们当前的顺序。 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]}

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

1 个答案:

答案 0 :(得分:0)

这是一项有趣的操作。我可以考虑使用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的{​​{1}}列。如果您希望按x组进行转换,则需要将n再转移x.b次。只需插入行

即可
n-1

>>> x.b = x.b.shift(n-1) 之后,然后执行x = df[df.a != df.b]步骤。