【问题标题】:Combining Pandas DataFrames With Multiple Reference Columns将 Pandas DataFrames 与多个参考列相结合
【发布时间】:2021-07-07 20:38:38
【问题描述】:

我正在尝试组合两个 pandas DataFrame,以根据第二个的标准更新第一个。这是两个数据框的示例: df1

year                                                                            
2016  CALIFORNIA          CLINTON, HILLARY         
2016  CALIFORNIA          TRUMP, DONALD J.         
2016  CALIFORNIA          JOHNSON, GARY          
2016  CALIFORNIA          STEIN, JILL          
2016  CALIFORNIA          WRITE-IN          
2016  CALIFORNIA          LA RIVA, GLORIA ESTELLA     
2016  TEXAS               TRUMP, DONALD J.    
2016  TEXAS               CLINTON, HILLARY    
2016  TEXAS               JOHNSON, GARY   
2016  TEXAS               STEIN, JILL         
...
           state             candidate  
year                                                                                                                                            
1988  CALIFORNIA        BUSH, GEORGE H.W.            
1988  CALIFORNIA        DUKAKIS, MICHAEL       
1988  CALIFORNIA        PAUL, RONALD ""RON""          
1988  CALIFORNIA        FULANI, LENORA  
1988  TEXAS             BUSH, GEORGE H.W.    
1988  TEXAS             DUKAKIS, MICHAEL   
1988  TEXAS             PAUL, RONALD ""RON""   
1988  TEXAS             FULANI, LENORA  

df2

year                                                                            
1988  CALIFORNIA             47
1988  TEXAS                  29
...  
2016  CALIFORNIA             55
2016  TEXAS                  38

从 2020 年到 1972 年的每个选举年都有数值,包括所有候选人和所有州,格式相似。 df1 中还有其他列,但它们与我正在尝试做的事情无关。

我的预期结果是:

year                                                                            
2016  CALIFORNIA          CLINTON, HILLARY         55
2016  CALIFORNIA          TRUMP, DONALD J.         55
2016  CALIFORNIA          JOHNSON, GARY            55
2016  CALIFORNIA          STEIN, JILL              55 
2016  CALIFORNIA          WRITE-IN                 55
2016  CALIFORNIA       LA RIVA, GLORIA ESTELLA     55 
2016  TEXAS              TRUMP, DONALD J.          38
2016  TEXAS              CLINTON, HILLARY          38
2016  TEXAS              JOHNSON, GARY             38
2016  TEXAS              STEIN, JILL               38
...
           state             candidate  
year                                                                                                                                            
1988  CALIFORNIA     BUSH, GEORGE H.W.             47
1988  CALIFORNIA      DUKAKIS, MICHAEL             47
1988  CALIFORNIA  PAUL, RONALD ""RON""             47
1988  CALIFORNIA        FULANI, LENORA             47
1988  TEXAS     BUSH, GEORGE H.W.                  29
1988  TEXAS      DUKAKIS, MICHAEL                  29
1988  TEXAS  PAUL, RONALD ""RON""                  29
1988  TEXAS        FULANI, LENORA                  29

我想将 df2 中的选举投票列与 df1 中的年份和州列相匹配,以便输入正确的值。我得到了一些帮助,并且能够在只有一列匹配时进行匹配(您可以查看问题和答案here),但我无法将其与两个参考点(年份和州)匹配.如果我按原样使用链接的代码,则会返回错误:

pandas.errors.InvalidIndexError:重新索引仅对具有唯一值的索引对象有效

我尝试过 apply、map、applymap、merge 等,但无法弄清楚。提前感谢您的帮助!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我相信您正在寻找的是left_merge。您应该指定 on=[....] 中的公共列,作为合并的基础。

    # Imports
    import pandas as pd
    
    # Specify two columns in the "on".
    pd.merge(df1,
             df2,
             how='left',
             on=['year','state'])
    
    Out[1821]:
     
        year       state                candidate  votes
    0   2016  CALIFORNIA         CLINTON, HILLARY     55
    1   2016  CALIFORNIA         TRUMP, DONALD J.     55
    2   2016  CALIFORNIA            JOHNSON, GARY     55
    3   2016  CALIFORNIA              STEIN, JILL     55
    4   2016  CALIFORNIA                 WRITE-IN     55
    5   2016  CALIFORNIA  LA RIVA, GLORIA ESTELLA     55
    6   2016       TEXAS         TRUMP, DONALD J.     38
    7   2016       TEXAS         CLINTON, HILLARY     38
    8   2016       TEXAS            JOHNSON, GARY     38
    9   2016       TEXAS              STEIN, JILL     38
    10  1988  CALIFORNIA        BUSH, GEORGE H.W.     47
    11  1988  CALIFORNIA         DUKAKIS, MICHAEL     47
    12  1988  CALIFORNIA     PAUL, RONALD ""RON""     47
    13  1988  CALIFORNIA           FULANI, LENORA     47
    14  1988       TEXAS        BUSH, GEORGE H.W.     29
    15  1988       TEXAS         DUKAKIS, MICHAEL     29
    16  1988       TEXAS     PAUL, RONALD ""RON""     29
    17  1988       TEXAS           FULANI, LENORA     29
    

    上面的代码可以写成:

    pd.merge(df1,
             df2,
             how='left',
             left_on=['year','state'],
             right_on=['year','state'])
    

    但由于2个dfs中的列相同,我们可以使用on = ['year', 'state']

    【讨论】:

    • 谢谢!我一直在尝试使用merge 尝试不同的组合,但它似乎从未正常工作。阅读您的代码解决方案,我更了解如何用它来做我现在想做的事情。
    • 欢迎,很高兴它有效。如果您的问题已经解决,请考虑接受其中一个答案。
    【解决方案2】:

    另一种写法-

    merged_df = df1.merge(df2, on=['year', 'state'], how='left')
    

    如果您只想使用 df1 中的 3 列 -

    df1 = pd.read_csv('<name_of_the_CSV_file>', usecols=['year', 'state', 'candidate'])
    

    【讨论】:

    • 这也有效!第二部分不是立即相关的,但它对我正在从事的项目的后续部分非常有用!
    猜你喜欢
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2021-11-11
    • 2019-08-06
    • 2023-03-22
    • 1970-01-01
    • 2022-01-09
    • 2018-05-16
    相关资源
    最近更新 更多