Python 将不等数据帧与所有值合并

Python 将不等数据帧与所有值合并,python,pandas,dataframe,jupyter-notebook,Python,Pandas,Dataframe,Jupyter Notebook,我想在某些条件下合并两个长度不等的数据帧。数据帧的详细信息如下: 数据帧A包含大约1000行 数据框B包含大约50行 两个数据框中的字段类似于 以一种方式: 数据帧A: print (df1) A_Organisation A_count A_Normalised A_Year 0 ABC 654 34545 2018 1 DEF 565 54564 2018 2

我想在某些条件下合并两个长度不等的数据帧。数据帧的详细信息如下:

  • 数据帧A包含大约1000行
  • 数据框B包含大约50行
  • 两个数据框中的字段类似于 以一种方式:

    数据帧A:

    print (df1)
       A_Organisation  A_count  A_Normalised  A_Year
    0             ABC      654         34545    2018
    1             DEF      565         54564    2018
    2             GHI      565         34546    2018
    3             QWE      790          3945    2018
    4             DSO      788          1561    2017
    5             DFB    34579           546    2017
    6             HHS       56         31651    2017
    7            FDGH       98           156    2016
    8            DSFH    51651        153156    2016
    9            KBIU      151          1561    2015
    10            SDF      165          6513    2015
    
    对于数据帧B:

    B_Name, B_count, B_Normalised value, B_year
    
    print (df2)
      B_Organisation  B_count  B_Normalised  B_Year
    0            MNO      123           432    2018
    1            MNO      133           234    2018
    2            MNO     8743           484    2017
    3            MNO     1335          1512    2015
    4            MNO      456          3454    2014
    5            MNO      345           234    2014
    
    现在,我想基于年份合并这两个数据帧,但我不想重复值。 i、 e.如果2018年的数据帧A中包含50个值,2018年的数据帧B中包含5个值。那么2018年的总行数应该是50,输出应该是:

    用于计数器列,然后使用
    重命名
    列避免列具有相同内容
    A\u年
    B\u年
    如果在
    合并
    中使用参数
    left\u on
    right\u on

    df1['g'] = df1.groupby('A_Year').cumcount()
    df2['g'] = df2.groupby('B_Year').cumcount()
    
    df = (df1.rename(columns={'A_Year':'Year'})
             .merge(df2.rename(columns={'B_Year':'Year'}), on=['Year','g'], how='outer')
             .drop('g', axis=1))
    

    用于计数器列,然后使用
    rename
    columns以避免具有相同内容的列
    A\u Year
    B\u Year
    ,如果在
    合并中使用参数
    left\u on
    right\u on

    df1['g'] = df1.groupby('A_Year').cumcount()
    df2['g'] = df2.groupby('B_Year').cumcount()
    
    df = (df1.rename(columns={'A_Year':'Year'})
             .merge(df2.rename(columns={'B_Year':'Year'}), on=['Year','g'], how='outer')
             .drop('g', axis=1))
    


    您已经显示了输出,但相应的输入也会很有帮助。按年份联接将创建一个多对多关系,其中任一数据帧中的每一行将匹配联接两侧的多行,并将结果相乘。您需要根据多个条件进行联接以删除重复项您已经显示了输出,但相应的输入也会非常有用。仅按年份联接将创建一个多对多关系,其中任一数据帧中的每一行都将匹配联接两侧的多行,并将结果相乘。您需要加入多个条件以删除重复项
    print (df)
       A_Organisation  A_count  A_Normalised  Year B_Organisation  B_count  \
    0             ABC    654.0       34545.0  2018            MNO    123.0   
    1             DEF    565.0       54564.0  2018            MNO    133.0   
    2             GHI    565.0       34546.0  2018            NaN      NaN   
    3             QWE    790.0        3945.0  2018            NaN      NaN   
    4             DSO    788.0        1561.0  2017            MNO   8743.0   
    5             DFB  34579.0         546.0  2017            NaN      NaN   
    6             HHS     56.0       31651.0  2017            NaN      NaN   
    7            FDGH     98.0         156.0  2016            NaN      NaN   
    8            DSFH  51651.0      153156.0  2016            NaN      NaN   
    9            KBIU    151.0        1561.0  2015            MNO   1335.0   
    10            SDF    165.0        6513.0  2015            NaN      NaN   
    11            NaN      NaN           NaN  2014            MNO    456.0   
    12            NaN      NaN           NaN  2014            MNO    345.0   
    
        B_Normalised  
    0          432.0  
    1          234.0  
    2            NaN  
    3            NaN  
    4          484.0  
    5            NaN  
    6            NaN  
    7            NaN  
    8            NaN  
    9         1512.0  
    10           NaN  
    11        3454.0  
    12         234.0