【问题标题】:Rename a column based on values in another column根据另一列中的值重命名列
【发布时间】:2020-10-03 07:38:04
【问题描述】:

我有一组四个数据帧:df_all = [df1, df2, df3, df4]

作为示例,它们如下所示:

df1:

Name     Dates        a

Apple   5-5-15        NaN
Apple   6-5-15        42
Apple   6-5-16        36
Apple   6-5-17        36

 df2: 

Name     Dates          a

Banana   5-5-15        85
Banana   6-5-15        NaN
Banana   6-6-15        100
Banana   6-5-16        18

我想合并“日期”,我通过以下方式实现:

for cols in df_all:
    cols = cols.drop(['Name'], axis=1, inplace=True)
a = df1.merge(df2, how='left', on = 'Date').merge(df3, how='left',  on = 'Date').merge(df4, how='left',  on = 'Date')

这正是我想要的。但是,这些列被重命名为a_x, a_y, a_x, a_y 下面的这个示例显示了当我只合并 df1 和 df2 时会发生什么。

Dates         a_x        a_y

5-5-15        NaN         85
6-5-15        42         NaN
6-6-15        NaN        100
6-5-16        36          18
6-5-17        36         NaN

在合并之前,我想根据名称(苹果或香蕉)中的值重命名列 a,并且我想尽可能自动化地将所有数据框列 'a' 重命名为中的值他们的专栏'Name'

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以在删除名称列之前进行重命名。由于数据框中的所有名称都相同,因此您可以从第一行获取它:

    for cols in df_all:
        cols.rename(columns={'a': cols.at[0, 'Name']}, inplace=True)
        cols = cols.drop(['Name'], axis=1, inplace=True)
    

    【讨论】:

      【解决方案2】:

      您可以通过在合并之前重命名列,然后使用functools.reduce 合并df_all 中的所有数据框来自动化合并数据框的过程:

      from functools import reduce 
      
      # rename column a
      df_all = [df.rename(columns={'a': df.pop('Name').iloc[0]}) for df in df_all]
      
      # merge all dataframes
      merged = reduce(lambda d1, d2: pd.merge(d1, d2, on=['Dates'], how='left') , df_all)
      

      # print(merged)
      # sample result after merging df1 & df2 
      
          Dates  Apple  Banana
      0  5-5-15    NaN    85.0
      1  6-5-15   42.0     NaN
      2  6-5-16   36.0    18.0
      3  6-5-17   36.0     NaN
      

      【讨论】:

        【解决方案3】:

        尝试在第一个 for 循环中更改列名,然后再删除该列。

        for cols in df_all:
            name = cols['Name'][0]
            cols.drop(['Name'],axis=1,inplace=True)
            cols.rename(columns={'a':name},inplace=True)
        a = df1.merge(df2, how='left', on = 'Date').merge(df3, how='left',  on = 'Date').merge(df4, how='left',  on = 'Date')
        

        【讨论】:

          【解决方案4】:

          尝试使用concat 并修改您的数据框

          df=pd.concat([x.set_index(['Name','Dates']).a.unstack(level=0) for x in listdf])
          

          或者合并然后pivot_table

          df=pd.concat([df1,df2]).pivot_table(index='Dates',columns='Name',values='a',aggfunc='first')
          Name    Apple  Banana
          Dates                
          5-5-15    NaN    85.0
          6-5-15   42.0     NaN
          6-5-16   36.0    18.0
          6-5-17   36.0     NaN
          6-6-15    NaN   100.0
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-14
            • 1970-01-01
            • 2020-07-05
            • 1970-01-01
            • 1970-01-01
            • 2022-01-17
            • 2021-03-08
            • 2014-10-25
            相关资源
            最近更新 更多