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

时间:2016-01-17 21:16:28

标签: python pandas

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

我们假设数据框称为df1df2df3,每个数据框都包含namedate和{{1}列}。

我想将count中的每个列重命名为df1name_df1date_df1

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

count_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

我真的在努力弄清楚为什么会这样。 df1的列(KeyError: 'name'中的第一个数据框)被重命名。其他一切都保持不变......我是否搞砸了基本语法(可能),或者是否存在一个根本的误解,即我知道事情应该如何运作?

从我可以确定的情况来看,列表中的第一个数据帧不止一次被迭代 - 但为什么会出现这种情况?

4 个答案:

答案 0 :(得分: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]

如果您的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]

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

答案 1 :(得分:4)

我更喜欢这样做的简单方法,尤其是当您想对所有列名应用某种逻辑时:

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

答案 2 :(得分:3)

我认为你存储在字典中,因为这是在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参数附加到重复列名称的后缀。如果您只想附加数据框的名称,可以这样调用它。 :

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]

答案 3 :(得分:2)

为了完整,由于没有人提到df.rename,请参阅Andy Hayden的回答:

Renaming columns in pandas

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)