在数据框中移动列
Posted
技术标签:
【中文标题】在数据框中移动列【英文标题】:Shifting columns in dataframe 【发布时间】:2019-10-31 07:09:24 【问题描述】:我有一个熊猫数据框:
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
varies 的列名称,因此有时我有[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
的所有值都被推入下一个更高的命名列,并且最高命名的列被丢弃。
我不确定如何以一种干净的 Python 方式来解决这个问题。
编辑:
对于[tempNorm_4 tempNorm_5 tempNorm_6 tempNorm_7 tempNorm_0]
,来自tempNorm_0
的值被移入tempNorm_4
;来自tempNorm_4
的值被移入tempNorm_5
等等。 tempNorm_7
数据被删除并被来自 tempNorm_6
的数据替换
【问题讨论】:
当您保留tempNorm_4 tempNorm_5 tempNorm_6 tempNorm_7
的订单时,为什么不保留预期的输出?我错过了什么吗?
请参阅问题的编辑。希望它能消除混乱。
【参考方案1】:
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
【讨论】:
太棒了 .. 我花了几分钟才意识到你刚刚用 2 行代码压缩了什么【参考方案2】:你也可以这样做:
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
【讨论】:
【参考方案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
【讨论】:
是的,我错过了关键字“roll”。感谢您的聪明回答。以上是关于在数据框中移动列的主要内容,如果未能解决你的问题,请参考以下文章