【问题标题】:Matching and renaming columns on a dataframe匹配和重命名数据框上的列
【发布时间】:2021-07-26 04:09:58
【问题描述】:

我有两个数据框:

df1:

  ID Drive Volume Rep
  1   2     3      4

df2:

 ID 2Volume Drive_1 Reps
  1   2       3      4

我已使用下表匹配列名

    df1    df2
   Drive   Drive_1
   Volume  2Volume
   Reps    Reps   

使用表中的地图,如何将 df2 中的所有列重命名为与 df1 相同

我可以使用简单的 df2 = df2.rename(columns={old:new}) 手动执行此操作。但我想要通用代码,可以使用不同的列名。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    也许这会有所帮助。

    df2.columns = df1.columns
    

    如果您想动态创建相似列的映射字典,您可以使用difflib

    import difflib
    col1 = ['ID', 'Drive','Volume','Rep'] # df1.columns.values
    col2 = [ 'ID', '2Volume', 'Drive_1', 'Reps']  # df2.columns.values
    col_dict = {difflib.get_close_matches(col, col2)[0]:col for col in col1}
    

    之后,运行上面的代码,你会得到一个这样的字典 -

    {'ID': 'ID', 'Drive_1': 'Drive', '2Volume': 'Volume', 'Reps': 'Rep'}
    

    上面的dict可以用来映射列

    【讨论】:

    • 这不知道如何匹配列。请记住,列可以是任何顺序和任何名称。第一步是,映射 df1 中要分配给 df2 的列名
    • @tjjudge 谢谢:)。我已经更新了我的答案。
    【解决方案2】:

    当你说你不想手动做df2 = df2.rename(columns={old:new})时,你的意思是你想从table自动拉出oldnew?如果是这样,你可以这样做:

    df2 = df2.rename(columns=dict(zip(table.df2, table.df1)))
    
    #    ID  Drive  Volume  Reps
    # 0   1      2       3     4
    

    或者:

    df2 = df2.rename(columns=table.set_index('df2').df1)
    

    【讨论】:

    • 我喜欢这个概念,但它似乎不起作用
    • 是的,我明白这一点,但出于某种原因.. 列名没有改变。虽然没有错误
    • @tjjudge 嗯,也许在您的真实情况下,df1/df2 列名或 table 值中存在虚假空格(或者您是说即使该示例也不适用于你)
    • 将发布另一个类似于我目前正在使用的数据集的问题。可以的话请看一下
    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 2020-09-11
    • 2022-01-20
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多