繁体   English   中英

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

[英]Renaming pandas data frame columns using a for loop

我不确定这是否是一种愚蠢的处理方式,但我有几个数据框,所有这些都有相同的列。 我需要重命名每个列中的列以反映每个数据框的名称(之后我将执行所有这些的外部合并)。

假设数据框称为df1df2df3 ,每个都包含列namedatecount

我想将df1中的每一列重命名为name_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

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

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

据我所知,列表中的第一个数据框被迭代了不止一次——但为什么会这样呢?

我想你可以用更简单的方法来实现这一点,比如:

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]

如果您的 DataFrames 有更漂亮的名称,您可以尝试:

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]

或者您可以通过查找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]

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

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

我假设您已将您的存储在字典中,因为这是在 Python 中存储一系列命名对象的惯用方式。 更改列名的惯用 Pandas 方法是在df.columns上使用矢量化字符串操作:

df_dict = {"df1":df1, "df2":df2, "df3":df3}
for name, df in df_dict.items():
   df.columns = df.columns + "_" + name

要考虑的另一个选项是在合并期间自动添加后缀。 当您调用merge您可以使用suffixes参数指定将附加到重复列名称的suffixes 如果您只想附加数据帧的名称,则可以这样调用。

from itertools import reduce
df_merged = reduce(lambda x,y: ("df_merged", 
                               x[1].merge(y[1], left_index=True, right_index=True, 
                                         suffixes = ("","_"+y[0]))),
                   df_dict.items())[1]

为了完整df.rename ,由于没有人提到df.rename ,请在此处查看 Andy Hayden 的回答:

重命名熊猫中的列

df.rename可以将函数作为参数,所以在这种情况下:

df_dict = {'df1':df1,'df2':df2,'df3':df3}
for name,df in df_dict.items():
    df.rename(lambda x: x+'_'+name, inplace=True)

更简单的方法

从 cursor.description 获取总长度然后将其转换为列表将列表直接应用到 DF

num_fields = len(cursor.description)
field_names = [ i[0] for i in cursor.description ]
df.columns = field_names

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM