在Python中使用for循环和Regex重命名来自不同数据帧的类似列

2024-06-16 10:43:09 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我使用了五个几乎相同的数据帧,但是用于不同的课程。它们被命名为df2b2015df4b2015df6b2015df2m2015

每一个数据帧都有一个名为prom_lect2b_rbd的列表示df2b2015prom_lect4b_rbd表示df4b2015,依此类推

我想附加这些数据帧,但是因为每一列都有不同的名称,所以它们不能一起使用。我试图将这些列中的每一列都转换成prom_lect_rbd列,这样就可以毫无问题地附加它们

有没有一种方法可以通过for循环和regex来实现。 要不然,我有没有别的办法

谢谢

PS:我知道一些事情,比如我可以用以下方法将这些列转换成我想要的:

re.sub('\d(b|m)','', a)

其中a是列名。但我找不到一种方法来混合循环和列重命名

编辑:

数据帧如下所示:

df2b2015年:

rbd   prom_lect2b_rbd
 1          5
 2          6

东风4B2015:

rbd   prom_lect4b_rbd
 1          8
 2          9

等等


Tags: 数据方法名称for命名课程rbdprom
2条回答

我设法做到了。可能不是最像Python的方式,但它实现了我想要的:

dfs=[df2b2015,df4b2015,df6b2015,df8b2015,df2m2015]
cols_lect=['prom_lect2b_rbd','prom_lect4b_rbd','prom_lect6b_rbd',
           'prom_lect8b_rbd','prom_lect2m_rbd']

for j,k in zip(dfs,cols_lect):
    j.rename(columns={k:re.sub('\d(b|m)','', k)}, inplace=True)

像这样,用.filter(regex=)?它确实假设每个数据帧只有一个匹配列,但您的示例允许这样做

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.rand(10,3),columns=['prom_lect2b_rbd','foo','bar'])
df2 = pd.DataFrame(np.random.rand(10,3),columns=['prom_lect4b_rbd','foo','bar'])

for df in [df1,df2]:
    colname = df.filter(regex='prom_lect*').columns.format()
    df.rename(columns={colname[0]:'prom_lect_rbd'})

print(df1)
print(df2)

相关问题 更多 >