Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数据帧与不可损坏的列合并_Python_Pandas_Dataframe_Merge - Fatal编程技术网

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