在数据框中移动列

时间:2019-06-17 16:40:26

标签: pandas python-3.5

我的熊猫数据框为:

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_4;来自tempNorm_4的值移入tempNorm_5,依此类推。 tempNorm_7数据被丢弃,并被tempNorm_6的数据替换

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

您还可以执行以下操作:

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