【问题标题】:How to shift several rows in a pandas DataFrame?如何在 pandas DataFrame 中移动几行?
【发布时间】:2017-08-01 15:14:49
【问题描述】:

我有以下熊猫数据框:

import pandas as pd
data = {'one' : pd.Series([1.], index=['a']), 'two' : pd.Series([1., 2.], index=['a', 'b']), 'three' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(data)
df = df[["one", "two", "three"]]


   one  two  three
a  1.0  1.0    1.0
b  NaN  2.0    2.0
c  NaN  NaN    3.0
d  NaN  NaN    4.0

我知道如何按列向上/向下移动元素,例如

df.two = df.two.shift(-1)

   one  two  three
a  1.0  2.0    1.0
b  NaN  NaN    2.0
c  NaN  NaN    3.0
d  NaN  NaN    4.0

但是,我想将a 行中的所有元素移到两列上,并将b 行中的所有元素移到一列上。最终的数据框如下所示:

   one  two  three
a  NaN  NaN    1.0
b  NaN  NaN    2.0
c  NaN  NaN    3.0
d  NaN  NaN    4.0

如何在 pandas 中做到这一点?

【问题讨论】:

  • 我们不需要转置DF,只需选择shift中的axis参数即可。看我的答案!

标签: python pandas dataframe shift


【解决方案1】:

恕我直言,这是一种更 Pythonic 的方式:

df.loc['a'] = df.loc['a'].shift(periods=2,axis=0)

注意在这种情况下.loc 返回一个系列,所以axis=0 是可选的。

【讨论】:

    【解决方案2】:

    您可以转置初始的DF,以便您可以将行标签作为列名访问,以便执行shift 操作。

    将相应列的内容向下移动这些数量,然后重新转置以获得所需的结果。

    df_t = df.T
    df_t.assign(a=df_t['a'].shift(2), b=df_t['b'].shift(1)).T
    

    【讨论】:

    • 不错的解决方案!我认为我们甚至可以稍微改进一下 - .shift() 接受 axis 参数:df.assign(one=df[['one']].shift(2, axis=1), two=df[['two']].shift(1, axis=1))
    • 是的,这似乎是一个不错的建议。但是,由于我们只是选择单个列 DF 并跨列执行移位,因此移位的数量不会对结果产生影响吗?
    • 试试这个案例-df = pd.DataFrame(np.arange(12).reshape(4,3), list('abcd'), ['one','two','three']),你就会明白我的意思了。此外,OP 只希望修改前两行:-)
    • 是的,我现在明白了。谢谢你的解释!不过,我不能第二次投票赞成你的答案;-)
    • 这是一个新问题,但我很好奇:不只是a=df_t['a'].shift(2), b=df_t['b'].shift(1),如果有多个列需要移动怎么办?就像列 a 虽然 z 需要移位 2,列 20 到 100 需要移位 5 等等?
    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多