鉴于以下数据:
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]}
我可以通过迭代来强制它,但我确信这是一个更好的解决方案。有什么想法吗?
答案 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]
步骤。