Python 将数据帧与不可损坏的列合并
我想合并两个数据帧。如果Python 将数据帧与不可损坏的列合并,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我想合并两个数据帧。如果项代码(例如A、B、C、D)相同, 它们的属性a,b必须相同,但b是一个numpy数组或一个 不幸的 傅: 酒吧: 这就是我想要的 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 您可以使用df.merge和df.fi
项
代码(例如A、B、C、D)相同,
它们的属性a
,b
必须相同,但b
是一个numpy数组或一个
不幸的
傅:
酒吧:
这就是我想要的
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
您可以使用
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
如果
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
下面是一种合并方法,无需将未损坏的元组转换为元组 因为
项
代码与a
中的值有1对1的对应关系,并且
b
列,仅在项上合并就足够了。由于项
列中的值是可散列的,
合并没有问题:
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)
屈服
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
然而,合并后需要进行一些润色工作。因为我们只有
在项
上合并,结果
获取两列a
和b
——它们来自栏
分别称为a_y
和b_y
。update
方法用于填写NaN值
使用a
中的相应值,然后也执行相同操作
对于b
使用foo.assign(foo=1)、bar.assign(bar=1)
来获取foo
和bar
列的聪明想法来自。或者您可以尝试一下
foo.b = foo.b.apply(tuple)
bar.b = bar.b.apply(tuple)
df=pd.concat([foo,bar],axis=0).drop_duplicates()
df['foo']=df.isin(foo).a.astype(int)
df['bar']=df.isin(bar).a.astype(int)
df.b=df.b.apply(list)
df
Out[60]:
a b item foo bar
0 1 [2, 0] A 1 1
1 1 [3, 0] B 1 0
2 0 [4, 0] C 1 0
1 0 [6, 1] D 0 1
当我合并时,它给我一个错误,说b是一个不可损坏的类型numpy。ndarray@niukasu好的,你的问题是关于元组的。但是您正在使用numpy数组:)@niukasu编辑,第二个解决方案应该会有所帮助。Thx非常有用。有没有办法在不将数据帧转换为元组的情况下获得所需的数据帧。@niukasu没有。到目前为止,API就是这样工作的。可能有一个没有合并的解决方案,但我不知道。我知道有一种方法。我不知道这是一个简单的合并项目
。不错。
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
foo.b = foo.b.apply(tuple)
bar.b = bar.b.apply(tuple)
df=pd.concat([foo,bar],axis=0).drop_duplicates()
df['foo']=df.isin(foo).a.astype(int)
df['bar']=df.isin(bar).a.astype(int)
df.b=df.b.apply(list)
df
Out[60]:
a b item foo bar
0 1 [2, 0] A 1 1
1 1 [3, 0] B 1 0
2 0 [4, 0] C 1 0
1 0 [6, 1] D 0 1
cols = ['a', 'b', 'item']
pd.concat([Foo, Bar], keys=['Foo', 'Bar']) \
.assign(c=1).pipe(lambda d: d.assign(b=d.b.apply(tuple))) \
.set_index(cols, append=True) \
.c.unstack(0, fill_value=0).reset_index(cols) \
.pipe(lambda d: d.assign(b=d.b.apply(list)))
a b item Bar Foo
0 1 [2, 0] A 1 1
1 0 [6, 1] D 1 0
1 1 [3, 0] B 0 1
2 0 [4, 0] C 0 1