在数据框中移动列
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_4
;tempNorm_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
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
我有一个 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_4
;tempNorm_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
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