【问题标题】:Merge two dataframes on a column of lists在一列列表上合并两个数据框
【发布时间】:2019-10-27 14:54:50
【问题描述】:

我有两个数据框。

df = pd.DataFrame([[1,2,3,[4,5]],[6,7,8,[9,10]]], columns=['a','b','c','d'])

df2 = pd.DataFrame([[4,'abc'],[5,'ef'], [10,'g'], [12,'hijk']], columns=['a_2','b_2'])

In [151]: df
Out[151]: 
   a  b  c        d
0  1  2  3   [4, 5]
1  6  7  8  [9, 10]

In [152]: df2
Out[152]: 
   a_2   b_2
0    4   abc
1    5    ef
2   10     g
3   12  hijk

我想根据df的'd'列合并两者并得到以下输出-

df3 = pd.DataFrame([[1,2,3,[4,5],['abc','ef']],[6,7,8,[9,10],['g']]], columns=['a','b','c','d','b_2'])


In [153]: df3
Out[153]: 
   a  b  c        d        b_2
0  1  2  3   [4, 5]  [abc, ef]
1  6  7  8  [9, 10]        [g]

我确实尝试了“合并”,但没有得到所需的结果。

【问题讨论】:

    标签: python pandas list dataframe merge


    【解决方案1】:

    这并不完全是一个合并问题,但我会使用调用 Series.getlist comprehension 来做到这一点:

    s = df2.set_index('a_2')['b_2']  # mapping to use
    [[s.get(y) for y in x if y in s] for x in df['d']]
    # [['abc', 'ef'], ['g']]
    

    # df['b_2'] = [[s.get(y) for y in x if y in s] for x in df['d']]
    df3 = df.assign(b_2=[[s.get(y) for y in x if y in s] for x in df['d']])
    df3
    
       a  b  c        d        b_2
    0  1  2  3   [4, 5]  [abc, ef]
    1  6  7  8  [9, 10]        [g]
    

    Evidence suggests 鉴于您的问题的不可向量化性质,列表推导应该相当快。

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 2019-09-19
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 2015-04-18
      • 2019-08-16
      相关资源
      最近更新 更多