在数据框中移动列

Shifting columns in dataframe

我有一个 pandas 数据框:

Date    normPwr_0   normPwr_1   tempNorm_1  tempNorm_2  tempNorm_3  tempNorm_0
6/15/2019    0.89    0.94       0.83        0.88        0.92        0.82 
6/16/2019    0.97    0.89       0.82        0.83        0.88        0.97 
6/17/2019    0.97    0.97       0.97        0.82        0.83        2,188.18 

我只想移动 tempNorm 列的列值。我想要的输出是:

Date    normPwr_0   normPwr_1   tempNorm_2  tempNorm_3  tempNorm_1
6/15/2019    0.89    0.94       0.83        0.88        0.82 
6/16/2019    0.97    0.89       0.82        0.83        0.97 
6/17/2019    0.97    0.97       0.97        0.82        2,188.18 

棘手的部分是 tempNorm 的列名称各不相同,有时我有 [tempNorm_1 tempNorm_2 tempNorm_3 tempNorm_0] 有时我有 [tempNorm_4 tempNorm_5 tempNorm_6 tempNorm_7 tempNorm_0]

当列有 [tempNorm_4 tempNorm_5 tempNorm_6 tempNorm_7 tempNorm_0] 时,输出数据框中我想要的列将是 [tempNorm_4 tempNorm_5 tempNorm_6 tempNorm_7]

基本上我试图移动包含 tempNorm 的列名称中的数据框,其中 tempNorm_0 中的所有值都被推入下一个更高命名的列,最高命名的列被丢弃。

我不确定如何以干净的 pythonic 方式处理这个问题。

编辑:

对于[tempNorm_4 tempNorm_5 tempNorm_6 tempNorm_7 tempNorm_0]tempNorm_0的值移入tempNorm_4tempNorm_4的值移入tempNorm_5,依此类推. tempNorm_7 数据丢失并被来自 tempNorm_6

的数据替换

IIUC,您想 roll 名称为 tempNorm_ 的列并删除最后一个:

# get all the tempNorm columns
tmp_cols = np.array([col for col in df.columns if 'tempNorm' in col])

# roll and rename:
df.rename(columns={col:new_col for col, new_col in zip(tmp_cols,np.roll(tmp_cols,-1) ) },
          inplace=True)

# drop the last tempNorm
df.drop(tmp_cols[-1], axis=1, inplace=True)

输出:

        Date  normPwr_0  normPwr_1  tempNorm_2  tempNorm_3 tempNorm_1
0  6/15/2019       0.89       0.94        0.83        0.88       0.82
1  6/16/2019       0.97       0.89        0.82        0.83       0.97
2  6/17/2019       0.97       0.97        0.97        0.82   2,188.18

您还可以执行以下操作:

m=df.filter(like='tempNorm').sort_index(axis=1)
n=m[m.columns[::-1]].T.shift(-1,axis=0).T.dropna(how='all',axis=1)
pd.concat([df[df.columns.difference(m.columns)],n],axis=1)

        Date  normPwr_0  normPwr_1 tempNorm_3 tempNorm_2 tempNorm_1
0  6/15/2019       0.89       0.94       0.88       0.83       0.82
1  6/16/2019       0.97       0.89       0.83       0.82       0.97
2  6/17/2019       0.97       0.97       0.82       0.97   2,188.18

sortedfilterrename

a, b, *c = sorted(df.filter(like='tempNorm'), key=lambda c: int(c.rsplit('_', 1)[1]))
df.drop(b, 1).rename(columns={a: b})

        Date  normPwr_0  normPwr_1  tempNorm_2  tempNorm_3 tempNorm_1
0  6/15/2019       0.89       0.94        0.88        0.92       0.82
1  6/16/2019       0.97       0.89        0.83        0.88       0.97
2  6/17/2019       0.97       0.97        0.82        0.83   2,188.18