合并/合并具有不同索引和不同列名称的DataFrame

时间:2019-01-18 20:22:01

标签: pandas dataframe

我无法以所需的方式合并两个数据框。我用mergejoin方法进行了很多尝试,但都没有成功,但是没有达到预期的效果。

import pandas as pd

d = {'A': [1, 1, 0, 1, 0, 1, 0],
     'B': [0, 0, 0, 0, 0, 1, 1]
     }
df = pd.DataFrame(data=d, index=["A", "B", "C", "D", "E", "F", "G"])
print(df)

d = {'A2': ["D", "A", "A", "B", "C", "C", "E", "X", "F", "G"],
     'B2': ["DD", "AA", "AA", "BB", "CC", "CC", "EE", "XX", "FF", "GG"],
     'C3': [1, 1, 11, 35, 53, 2, 76, 45, 5, 34]}


df2 = pd.DataFrame(data=d)
print(df2)

控制台输出:

   A  B
A  1  0
B  1  0
C  0  0
D  1  0
E  0  0
F  1  1
G  0  1

  A2  B2  C3
0  A  AA   1
1  A  AA  11
2  B  BB  35
3  C  CC  53
4  C  CC   2
5  E  EE  76
6  X  XX  45
7  F  FF   5
8  G  GG  34

我正在寻找一种计算以下各项的方法:通过df的索引,我可以在A2的{​​{1}}列中查找df2的值,其中应该添加到B2中。

所需结果:

df

(这只是伪数据,仅复制索引并将其写入 A B B2 A 1 0 AA B 1 0 BB C 0 0 CC D 1 0 DD E 0 0 EE F 1 1 FF G 0 1 GG 的{​​{1}}列中是不够的)

2 个答案:

答案 0 :(得分:3)

set_index并分配

df['B2']=df2.drop_duplicates('A2').set_index('A2')['B2']
df
Out[728]: 
   A  B  B2
A  1  0  AA
B  1  0  BB
C  0  0  CC
D  1  0  DD
E  0  0  EE
F  1  1  FF
G  0  1  GG

答案 1 :(得分:1)

我知道W-B已经以非常优雅的方式回答了这一问题。

但是,由于我花了很多时间以一种不太专业的方式来解决此问题,所以让我也发布我的解决方案。

发件人:

  

我正在寻找一种计算以下内容的方法:通过df的索引I   可以在df2的A2列中查找应添加的B2值   到df。

我知道我应该这样做:

  1. 获取索引列表表格df。所以A,B,C ...
  2. 对于df索引的每个元素,在与df2 ['A2']相同的索引中查找df2 ['B2']中的值
  3. 在df中创建一个新列['B2'],我们在其中将与df中的索引匹配的df2 ['B2']中的这些值复制到df2 ['A2']中的元素

这是我的代码:

import pandas as pd

d = {'A': [1, 1, 0, 1, 0, 1, 0],
     'B': [0, 0, 0, 0, 0, 1, 1]
     }
df = pd.DataFrame(data=d, index=["A", "B", "C", "D", "E", "F", "G"])
print(df)

d = {'A2': ["D", "A", "A", "B", "C", "C", "E", "X", "F", "G"],
     'B2': ["DD", "AA", "AA", "BB", "CC", "CC", "EE", "XX", "FF", "GG"],
     'C3': [1, 1, 11, 35, 53, 2, 76, 45, 5, 34]}


df2 = pd.DataFrame(data=d)
print(df2)

llista=[]
for i in df.index:
    m=df2['A2'].loc[df2['A2']==i].index
    if m[0]:
        print m[0],i
        llista.append(df2['B2'].iloc[m[0]])
    else:
        llista.append([])
df['B2'] = llista

输出为:

   A  B  B2
A  1  0  AA
B  1  0  BB
C  0  0  CC
D  1  0  []
E  0  0  EE
F  1  1  FF
G  0  1  GG

您看到的与已接受的帖子不同。这是因为df2 ['A2']中没有'D'索引