【问题标题】:merging dataframes and keeping some columns while repeating some of the columns pandas合并数据框并保留一些列,同时重复一些列熊猫
【发布时间】:2018-03-07 08:19:04
【问题描述】:

我有两个 pandas 数据框,df1 和 df2。两者都至少有两列同名(c1 和 c2),然后还有其他列,例如:

df1
-----------------
c1  c2  c4   c5
-----------------
10  1   hh  2231
11  1   fgf 2142
12  1   fg  1232

df2
-----------------
c1  c2   c6  c7
-----------------
10  2   110  231
10  3   111  332
11  2   112  123
11  3   113  432
12  2   114  432
12  3   115  432
13  2   116  432
13  3   117  432
14  2   118  432
14  3   119  432

我想合并这两个数据框:

  • df 中存在 c1 和 c2 的联合
  • c4 和 c5 对来自 df1 的对应 c1 和 c2 值的所有实例重复
  • 其余列,即 c6 和 c7 与 df2 中的 c1 和 c2 匹配,并与 df1 中的 c1 值匹配,然后添加到生成的 df 中。

在上一个问题中,我得到了执行外连接的答案,我根据 c1 和 c2 执行了外连接,并返回以下示例:

c1  c2  c4  c5      c6      c7
--------------------------------
10  1   hh  2231        
10  2               110     231
10  3               111     332

但是,我想将 c4 和 c5 的值重复为结果 df,如下所示:

结果数据框:

c1  c2  c4  c5           c6     c7
-----------------------------------
10  1   hh  2231        
10  2   hh  2231        110     231
10  3   hh  2231        111     332
11  1   fgf 2142        
11  2   fgf 2142        112     123
11  3   fgf 2142        113     432
12  1   fg  1232        
12  2   fg  1232        114     432
12  3   fg  1232        115     432
13  1   dd  4532        
13  2   dd  4532        116     432
13  3   dd  4532        117     432
14  2                   118     432
14  3                   119     432

有人可以帮我解决这个问题吗?提前致谢!

【问题讨论】:

  • 与上面的链接相同,只是您将合并 2 列,而不是 1 列。这与您之前的问题相似,对吗?
  • @cᴏʟᴅsᴘᴇᴇᴅ 上一个问题和这个问题之间的区别在于,在上一个问题中,我得到的结果如最后一个数据框(上面)所示,但正如我在这个问题中提到的那样,我想执行合并时,有一些列重复并且没有缺失值。所以我认为这不是一个重复的问题,而是对前一个问题的进一步增强。你能帮忙解决这个问题吗?谢谢!

标签: python pandas dataframe


【解决方案1】:

你可以使用:

  • 首先concatc1, c2,排序并在必要时删除重复项
  • merge 左连接的两个数据帧
  • ffillbfill 的最后重复值

df = (pd.concat([df1[['c1','c2']], df2[['c1','c2']]])
        .sort_values(['c1','c2'])
        .drop_duplicates()
        .merge(df1, on=['c1','c2'], how='left')
        .merge(df2, on=['c1','c2'], how='left')
)

df[['c4','c5']] = df.groupby('c1')['c4','c5'].apply(lambda x: x.ffill().bfill())
print (df)
    c1  c2   c4      c5     c6     c7
0   10   1   hh  2231.0    NaN    NaN
1   10   2   hh  2231.0  110.0  231.0
2   10   3   hh  2231.0  111.0  332.0
3   11   1  fgf  2142.0    NaN    NaN
4   11   2  fgf  2142.0  112.0  123.0
5   11   3  fgf  2142.0  113.0  432.0
6   12   1   fg  1232.0    NaN    NaN
7   12   2   fg  1232.0  114.0  432.0
8   12   3   fg  1232.0  115.0  432.0
9   13   2  NaN     NaN  116.0  432.0
10  13   3  NaN     NaN  117.0  432.0
11  14   2  NaN     NaN  118.0  432.0
12  14   3  NaN     NaN  119.0  432.0

【讨论】:

    【解决方案2】:

    您只需要使用pd.concat 而不是合并或加入。这是一个例子

    import pandas as pd
    import numpy as np
    
    a = np.arange(1,4)
    b = np.arange(5,8)
    c = np.random.randint(0,10,size=3)
    d = np.random.randint(0,10,size=3)
    df_1 = pd.DataFrame({'a':a,'b':b,'c':c,'d':d})
    
    out:
    
        a   b   c   d
    0   1   5   5   1
    1   2   6   7   5
    2   3   7   6   9
    
    a = np.arange(4,7)
    b = np.arange(7,10)
    e = np.random.randint(0,10,size=3)
    f = np.random.randint(0,10,size=3)
    df_2 = pd.DataFrame({'a':a,'b':b,'e':c,'f':d})
    df_2
    
    out:
    
        a   b   e   f
    0   4   7   9   9
    1   5   8   9   3
    2   6   9   2   1
    
    pd.concat([df_1,df_2])
    
    out:
    
        a   b    c      d       e       f
    0   1   5   5.0     1.0     NaN     NaN
    1   2   6   7.0     5.0     NaN     NaN
    2   3   7   6.0     9.0     NaN     NaN
    0   4   7   NaN     NaN     9.0     9.0
    1   5   8   NaN     NaN     9.0     3.0
    2   6   9   NaN     NaN     2.0     1.0
    

    【讨论】:

    • 问题是对于 col a 在两个数据框中我有相同的值。
    猜你喜欢
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    相关资源
    最近更新 更多