在Python中将列的值移动x行

时间:2019-05-21 12:46:53

标签: python-3.x pandas

我想将数据帧中一列的值移动x行(小时)。

例如,在以下数据框中:

ind = pd.date_range('01 / 01 / 2000', periods=5, freq='12H')
df = pd.DataFrame({"A": [1, 2, 3, 4, 5],
               "B": [10, 20, 30, 40, 50],
               "C": [11, 22, 33, 44, 55],
               "D": [12, 24, 51, 36, 2]},
              index=ind)

我想将A列中的值移动两个小时。

我使用以下内容:

mask = (df.columns.isin(['A']))
cols_to_shift = df.columns[mask]
df[cols_to_shift] = df[cols_to_shift].shift(2,freq='H')

但是,所有列A的值都填充有NA。我猜是因为这些值转移到了索引列中不存在的小时数。

有办法解决吗?

这是输入:

enter image description here

这是输出:

enter image description here

谢谢

1 个答案:

答案 0 :(得分:2)

IIUC,您可以尝试分配shifted值,然后使用pandas.concat扩展原始DataFrame。我还在这里使用DataFrame.sort_indexDataFrame.fillna对结果进行排序并处理NaN

# Example setup
ind = pd.date_range('01 / 01 / 2000', periods=5, freq='12H')
df = pd.DataFrame({"A": [1, 2, 3, 4, 5],
               "B": [10, 20, 30, 40, 50],
               "C": [11, 22, 33, 44, 55],
               "D": [12, 24, 51, 36, 2]},
              index=ind)

mask = (df.columns.isin(['A']))
cols_to_shift = df.columns[mask]
shifted = df[cols_to_shift].shift(2, freq='H')

df[cols_to_shift] = shifted
df = pd.concat([df, shifted]).sort_index().fillna(0)

print(df)

[出]

                       A     B     C     D
2000-01-01 00:00:00  0.0  10.0  11.0  12.0
2000-01-01 02:00:00  1.0   0.0   0.0   0.0
2000-01-01 12:00:00  0.0  20.0  22.0  24.0
2000-01-01 14:00:00  2.0   0.0   0.0   0.0
2000-01-02 00:00:00  0.0  30.0  33.0  51.0
2000-01-02 02:00:00  3.0   0.0   0.0   0.0
2000-01-02 12:00:00  0.0  40.0  44.0  36.0
2000-01-02 14:00:00  4.0   0.0   0.0   0.0
2000-01-03 00:00:00  0.0  50.0  55.0   2.0
2000-01-03 02:00:00  5.0   0.0   0.0   0.0