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)
你可以使用df.merge和df.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)
这是一种合并方式,无需将不可用数据转换为元组.
由于item代码与a和
b列中的值具有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得到两列a和b- 来自bar
被调用的a_y,和b_y.该update方法用于从a相应的值中填充NaN值a_y,然后也进行相同的操作b.
foo.assign(Foo=1), bar.assign(Bar=1)用于获取Foo和Bar列的聪明想法取自cᴏʟᴅsᴘᴇᴇᴅ的解决方案.
| 归档时间: |
|
| 查看次数: |
2575 次 |
| 最近记录: |