在数据框中移动列

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 

棘手的部分是tempNormvaries 的列名称,因此有时我有[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”。感谢您的聪明回答。

以上是关于在数据框中移动列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 表的列中向下移动值?

如何在pandas数据框中移动列

将熊猫数据框中的列向上移动一位?

计算MySQL列中不同值的移动平均值

从下一列中删除 NaN 值和移位值

Python - 每列中所选行的标准偏差