使用for循环重命名熊猫数据框列

scr*_*lex 3 python pandas

我不确定这是否是愚蠢的方法,但是我有几个数据帧,所有数据帧都有相同的列。我需要重命名每个列中的列以反映每个数据框的名称(此后,我将对所有这些列进行外部合并)。

比方说,数据帧被称为df1df2并且df3,每个包含列namedatecount

我想每一列重命名df1name_df1date_df1count_df1

我编写了一个函数来重命名列,因此:

df_list=[df1, df2, df3]

def rename_cols():
    col_name="name"+suffix
    col_count="count"+suffix
    col_date="date"+suffix

for x in df_list:
    if x['name'].tail(1).item() == df1['name'].tail(1).item():
        suffix="_"+"df1"
        rename_cols()
        continue
    elif x['name'].tail(1).item() == df2['name'].tail(1).item():
        suffix="_"+"df2"
        rename_cols()
        continue
    else:
        suffix="_"+"df3"
        rename_cols()

    col_names=[col_name,col_date,col_count]
    x.columns=col_names
Run Code Online (Sandbox Code Playgroud)

不幸的是,我收到以下错误: KeyError: 'name'

我真的很难弄清楚为什么会这样。df1的列(的第一个数据帧df_list)被重命名。其他所有内容都保持不变...我是在搞乱基本语法(可能是),还是我对事情应该如何工作有根本的误解?

据我所知,列表中的第一个数据帧将不止一次地迭代-但是为什么会这样呢?

小智 6

我更喜欢这样做的相当简单的方法,特别是当你想对所有列名应用一些逻辑时:

for col in df.columns:
    df.rename(columns={col:col.upper().replace(" ","_")},inplace=True)
Run Code Online (Sandbox Code Playgroud)


mgc*_*mgc 5

我想您可以使用以下更简单的方法来实现此目的:

df_list=[df1, df2, df3]
for i, df in enumerate(df_list, 1):
    df.columns = [col_name+'_df{}'.format(i) for col_name in df.columns]
Run Code Online (Sandbox Code Playgroud)

如果您的DataFrame具有漂亮的名称,则可以尝试:

df_names=('Home', 'Work', 'Park')
for df_name in df_names:
    df = globals()[df_name]
    df.columns = [col_name+'_{}'.format(df_name) for col_name in df.columns]
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过查找globals()(或locals())获取每个变量的名称:

df_list = [Home, Work, Park]
for df in df_list:
    name = [k for k, v in globals().items() if id(v) == id(df) and k[0] != '_'][0]
    df.columns = [col_name+'_{}'.format(name) for col_name in df.columns]
Run Code Online (Sandbox Code Playgroud)