我想将数据帧中一列的值移动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。我猜是因为这些值转移到了索引列中不存在的小时数。
有办法解决吗?
这是输入:
这是输出:
谢谢
答案 0 :(得分:2)
IIUC,您可以尝试分配shifted
值,然后使用pandas.concat
扩展原始DataFrame
。我还在这里使用DataFrame.sort_index
和DataFrame.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