将数据帧与不可用的列合并

niu*_*asu 2 python merge dataframe pandas

我想合并两个Pandas DataFrames.如果item代码(例如A,B,C,d)是相同的,它们的属性a,b必须是相同的,但b是一个numpy的阵列或即unhashable列表.

富:

item   a     b              
A      1     [2,0] 
B      1     [3,0]         
C      0     [4,0]         
Run Code Online (Sandbox Code Playgroud)

酒吧:

item   a     b
A      1     [2,0]
D      0     [6,1]
Run Code Online (Sandbox Code Playgroud)

这就是我要的

code   a     b        Foo   Bar
A      1     [2,0]    1     1
B      1     [3,0]    1     0
C      0     [4,0]    1     0
D      0     [6,1]    0     1
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 5

你可以使用df.mergedf.fillna:

out = foo.assign(Foo=1).merge(bar.assign(Bar=1), 'outer').fillna(0)
print(out)

  item  a       b  Foo  Bar
0    A  1  (2, 0)  1.0  1.0
1    B  1  (3, 0)  1.0  0.0
2    C  0  (4, 0)  1.0  0.0
3    D  0  (6, 1)  0.0  1.0
Run Code Online (Sandbox Code Playgroud)

如果b是列表类型,您可以先将其转换为元组然后合并.

foo.b = foo.b.apply(tuple)
bar.b = bar.b.apply(tuple)
out = foo.assign(Foo=1).merge(bar.assign(Bar=1), 'outer').fillna(0)
out.b = out.b.apply(list)

print(out)

  item  a       b  Foo  Bar
0    A  1  [2, 0]  1.0  1.0
1    B  1  [3, 0]  1.0  0.0
2    C  0  [4, 0]  1.0  0.0
3    D  0  [6, 1]  0.0  1.0
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 5

这是一种合并方式,无需将不可用数据转换为元组.

由于item代码与ab列中的值具有1对1的对应关系,因此item单独合并就足够了.由于item列中的值是可清除的,因此合并没有问题:

import pandas as pd

foo = pd.DataFrame({'item': list('ABC'), 'a':[1,1,0], 'b':[[2,0], [3,0], [4,0]]})
bar = pd.DataFrame({'item': list('AD'), 'a':[1,0], 'b':[[2,0], [6,1]]})

result = pd.merge(foo.assign(Foo=1), bar.assign(Bar=1), on='item', how='outer',
                  suffixes=['', '_y'])
for col in ['a','b']:
    result[col].update(result[col+'_y'])

for col in ['Foo', 'Bar']:
    result[col] = result[col].fillna(0)
result = result.drop(['a_y', 'b_y'], axis=1)
print(result)
Run Code Online (Sandbox Code Playgroud)

产量

     a       b item  Foo  Bar
0  1.0  [2, 0]    A  1.0  1.0
1  1.0  [3, 0]    B  1.0  0.0
2  0.0  [4, 0]    C  1.0  0.0
3  0.0  [6, 1]    D  0.0  1.0
Run Code Online (Sandbox Code Playgroud)

但是,合并后需要进行一些修补工作.因为我们只是合并item,result得到两列ab- 来自bar 被调用的a_y,和b_y.该update方法用于从a相应的值中填充NaN值a_y,然后也进行相同的操作b.

foo.assign(Foo=1), bar.assign(Bar=1)用于获取FooBar列的聪明想法取自cᴏʟᴅsᴘᴇᴇᴅ的解决方案.