我有两个数据帧
>>df1.info()
>><class 'pandas.core.frame.DataFrame'>
Int64Index: 2598374 entries, 3975 to 3054366
Data columns (total 14 columns): ......
>>df2.info()
>><class 'pandas.core.frame.DataFrame'>
Int64Index: 2520405 entries, 2066 to 2519507
Data columns (total 5 columns): ......
我想要内心加入他们。我试过pd.merge
,我得到了内存错误。因此,我尝试在没有pd.merge
的情况下做同样的事情。
原始方法的示例数据帧(失败:内存错误)
df1 = pd.DataFrame({'A': ['1', '2', '3', '4','5'],
'B': ['1', '1', '1', '1','1'],
'C': ['c', 'A1', 'a', 'c3','a'],
'D': ['B1', 'B1', 'B2', 'B3','B4'],
'E': ['3', '3', '3', '3','3'],
'F': ['3', '4', '5', '6','7'],
'G': ['2', '2', '2', '2','2']})
df2 = pd.DataFrame({'A': ['1', '2', '8','4'],
'B': ['1', '2', '5','1'],
'x': ['3', '3', '2','2'],
'y': ['3', '4', '6','7'],
'z': ['2', '2', '2','2']})
>> df1
A B C D E F G
0 1 1 c B1 3 3 2
1 2 1 A1 B1 3 4 2
2 3 1 a B2 3 5 2
3 4 1 c3 B3 3 6 2
4 5 1 a B4 3 7 2
df2
A B x y z
0 1 1 3 3 2
1 2 2 3 4 2
2 8 5 2 6 2
3 4 1 2 7 2
df1 = pd.merge(df1,df2,how='inner',on=['A','B'])
>> df1
A B C D E F G x y z
0 1 1 c B1 3 3 2 3 3 2
1 4 1 c3 B3 3 6 2 2 7 2
新方法的示例
(1)我试图删除df1中不在df2中的行[&#39; A&#39;] [&#39; B&#39;]。
(2)将x,y,z列连接到df1
df1 = pd.DataFrame({'A': ['1', '2', '3', '4','5'],
'B': ['1', '1', '1', '1','1'],
'C': ['c', 'A1', 'a', 'c3','a'],
'D': ['B1', 'B1', 'B2', 'B3','B4'],
'E': ['3', '3', '3', '3','3'],
'F': ['3', '4', '5', '6','7'],
'G': ['2', '2', '2', '2','2']})
df2 = pd.DataFrame({'A': ['1', '2', '8','4'],
'B': ['1', '2', '5','1'],
'x': ['3', '3', '2','2'],
'y': ['3', '4', '6','7'],
'z': ['2', '2', '2','2']})
>> df1
A B C D E F G
0 1 1 c B1 3 3 2
1 2 1 A1 B1 3 4 2
2 3 1 a B2 3 5 2
3 4 1 c3 B3 3 6 2
4 5 1 a B4 3 7 2
df2
A B x y z
0 1 1 3 3 2
1 2 2 3 4 2
2 8 5 2 6 2
3 4 1 2 7 2
df1 = df1.loc[((df1['A'].isin(df2.A)) & (df1['B'].isin(df2.B)) ) ]
>> df1
A B C D E F G
0 1 1 c B1 3 3 2
1 2 1 A1 B1 3 4 2
3 4 1 c3 B3 3 6 2
然而,我遇到了逻辑错误,我不知道解决这个问题。 有人可以帮忙吗?
答案 0 :(得分:1)
df1 = pd.concat([df1.set_index(['A','B']),
df2.set_index(['A','B'])], axis=1, join='inner')
print (df1)
C D E F G x y z
A B
1 1 c B1 3 3 2 3 3 2
4 1 c3 B3 3 6 2 2 7 2
或与boolean indexing
组合:
df1 = df1[((df1['A'].isin(df2.A)) & (df1['B'].isin(df2.B)) ) ]
print (df1)
A B C D E F G
0 1 1 c B1 3 3 2
1 2 1 A1 B1 3 4 2
3 4 1 c3 B3 3 6 2
df2 = df2[((df2['A'].isin(df1.A)) & (df2['B'].isin(df1.B)) ) ]
print (df2)
A B x y z
0 1 1 3 3 2
3 4 1 2 7 2
df3 = pd.concat([df1.set_index(['A','B']),
df2.set_index(['A','B'])], axis=1, join='inner')
print (df3)
C D E F G x y z
A B
1 1 c B1 3 3 2 3 3 2
4 1 c3 B3 3 6 2 2 7 2
如果过滤后df1
不大,请使用merge
:
df1 = df1[((df1['A'].isin(df2.A)) & (df1['B'].isin(df2.B)) ) ]
print (df1)
A B C D E F G
0 1 1 c B1 3 3 2
1 2 1 A1 B1 3 4 2
3 4 1 c3 B3 3 6 2
df2 = df2[((df2['A'].isin(df1.A)) & (df2['B'].isin(df1.B)) ) ]
print (df2)
A B x y z
0 1 1 3 3 2
3 4 1 2 7 2
df3 = pd.merge(df1,df2, on=['A','B'])
print (df3)
A B C D E F G x y z
0 1 1 c B1 3 3 2 3 3 2
1 4 1 c3 B3 3 6 2 2 7 2
答案 1 :(得分:0)
使用isin()
然后使用pd.concat
会出现一些多索引问题
我通过np.array_split
解决了这个问题。
第1步: 将数据帧拆分为5个数据帧
dfa,dfb,dfc,dfd,dfe = np.array_split(df1,5)
第2步: 单独合并
dfa = pd.merge(dfa,df2,how='inner',on=['A','B'])
dfb = pd.merge(dfb,df2,how='inner',on=['A','B'])
dfc = pd.merge(dfc,df2,how='inner',on=['A','B'])
dfd = pd.merge(dfd,df2,how='inner',on=['A','B'])
dfe = pd.merge(dfe,df2,how='inner',on=['A','B'])
第3步: 将它们附加到一个数据框
result = dfa.append([dfb, dfc,dfd,dfe])