我的熊猫数据框为:
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
的数据替换
答案 0 :(得分:4)
sorted
,filter
,rename
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