python中的外部连接
我有两个数据集,如下所示python中的外部连接,python,numpy,pandas,join,merge,Python,Numpy,Pandas,Join,Merge,我有两个数据集,如下所示 A B IDs IDs 1 1 2 2 3 5 4 7 在Pandas,Numpy中,我们如何应用一个连接,它可以提供来自B的所有数据,而B在a中不存在 像下面这样的 B Ids 5 7 我知道可以用for循环完成,但我不想,因为我的真实数据是数百万,我真的不知道如何在这里使用Panda Numpy,比如 pd.merge(A, B, on='ids', how='right') 谢
A B
IDs IDs
1 1
2 2
3 5
4 7
在Pandas,Numpy中,我们如何应用一个连接,它可以提供来自B的所有数据,而B在a中不存在
像下面这样的
B
Ids
5
7
我知道可以用for循环完成,但我不想,因为我的真实数据是数百万,我真的不知道如何在这里使用Panda Numpy,比如
pd.merge(A, B, on='ids', how='right')
谢谢您可以使用参数指示器
,然后。最后您可以合并列\u
A = pd.DataFrame({'IDs':[1,2,3,4],
'B':[4,5,6,7],
'C':[1,8,9,4]})
print (A)
B C IDs
0 4 1 1
1 5 8 2
2 6 9 3
3 7 4 4
B = pd.DataFrame({'IDs':[1,2,5,7],
'A':[1,8,3,7],
'D':[1,8,9,4]})
print (B)
A D IDs
0 1 1 1
1 8 8 2
2 3 9 5
3 7 4 7
df = (pd.merge(A, B, on='IDs', how='outer', indicator=True))
df = df[df._merge == 'right_only']
df = df.drop('_merge', axis=1)
print (df)
B C IDs A D
4 NaN NaN 5.0 3.0 9.0
5 NaN NaN 7.0 7.0 4.0
您可以与参数指示器一起使用
,然后。最后您可以合并列\u
A = pd.DataFrame({'IDs':[1,2,3,4],
'B':[4,5,6,7],
'C':[1,8,9,4]})
print (A)
B C IDs
0 4 1 1
1 5 8 2
2 6 9 3
3 7 4 4
B = pd.DataFrame({'IDs':[1,2,5,7],
'A':[1,8,3,7],
'D':[1,8,9,4]})
print (B)
A D IDs
0 1 1 1
1 8 8 2
2 3 9 5
3 7 4 7
df = (pd.merge(A, B, on='IDs', how='outer', indicator=True))
df = df[df._merge == 'right_only']
df = df.drop('_merge', axis=1)
print (df)
B C IDs A D
4 NaN NaN 5.0 3.0 9.0
5 NaN NaN 7.0 7.0 4.0
你可以这样用-
np.setdiff1d(B['IDs'],A['IDs'])
B[~np.in1d(B['IDs'],A['IDs'])]
同样,也可以用于相同的效果,就像这样-
np.setdiff1d(B['IDs'],A['IDs'])
B[~np.in1d(B['IDs'],A['IDs'])]
请注意,np.setdiff1d
将给我们一个排序的NumPy数组作为输出
样本运行-
>>> A = pd.DataFrame([1,2,3,4],columns=['IDs'])
>>> B = pd.DataFrame([1,7,5,2],columns=['IDs'])
>>> np.setdiff1d(B['IDs'],A['IDs'])
array([5, 7])
>>> B[~np.in1d(B['IDs'],A['IDs'])]
IDs
1 7
2 5
你可以这样用-
np.setdiff1d(B['IDs'],A['IDs'])
B[~np.in1d(B['IDs'],A['IDs'])]
同样,也可以用于相同的效果,就像这样-
np.setdiff1d(B['IDs'],A['IDs'])
B[~np.in1d(B['IDs'],A['IDs'])]
请注意,np.setdiff1d
将给我们一个排序的NumPy数组作为输出
样本运行-
>>> A = pd.DataFrame([1,2,3,4],columns=['IDs'])
>>> B = pd.DataFrame([1,7,5,2],columns=['IDs'])
>>> np.setdiff1d(B['IDs'],A['IDs'])
array([5, 7])
>>> B[~np.in1d(B['IDs'],A['IDs'])]
IDs
1 7
2 5
您可以将数据系列转换为集合并取其差异:
import pandas as pd
df=pd.DataFrame({'A' : [1,2,3,4], 'B' : [1,2,5,7]})
A=set(df['A'])
B=set(df['B'])
C=pd.DataFrame({'C' : list(B-A)}) # Take difference and convert back to DataFrame
然后,变量“C”产生
C
0 5
1 7
您可以将数据系列转换为集合并取其差异:
import pandas as pd
df=pd.DataFrame({'A' : [1,2,3,4], 'B' : [1,2,5,7]})
A=set(df['A'])
B=set(df['B'])
C=pd.DataFrame({'C' : list(B-A)}) # Take difference and convert back to DataFrame
然后,变量“C”产生
C
0 5
1 7
您只需使用pandas的.isin()
方法:
df = pd.DataFrame({'A' : [1,2,3,4], 'B' : [1,2,5,7]})
df[~df['B'].isin(df['A'])]
如果这些是单独的数据帧:
a = pd.DataFrame({'IDs' : [1,2,3,4]})
b = pd.DataFrame({'IDs' : [1,2,5,7]})
b[~b['IDs'].isin(a['IDs'])]
输出:
IDs
2 5
3 7
您只需使用pandas的.isin()
方法:
df = pd.DataFrame({'A' : [1,2,3,4], 'B' : [1,2,5,7]})
df[~df['B'].isin(df['A'])]
如果这些是单独的数据帧:
a = pd.DataFrame({'IDs' : [1,2,3,4]})
b = pd.DataFrame({'IDs' : [1,2,5,7]})
b[~b['IDs'].isin(a['IDs'])]
输出:
IDs
2 5
3 7
尝试代替right
您可以指定outer
。预期的输出是什么?列名似乎是A和B,而不是ID。。。这有误导性。请尝试使用右
代替。您可以指定外部
。预期的输出是什么?列名似乎是A和B,而不是ID。。。这是误导,非常感谢!但尽管我多次尝试:“我收到错误,列表索引必须是整数而不是列表”@manusharma那么,除了IDs
列中的整数之外,你还有什么其他东西吗,比如字符串或整数作为字符串?我有两个大列表/数据帧,其中一些很长,整数,我尝试使用Map(int,dataset)要将所有内容转换为一个,同样的错误列表索引必须是整数而不是列表谢谢!但尽管我多次尝试:“我收到错误,列表索引必须是整数而不是列表”@manusharma那么,除了IDs
列中的整数之外,你还有什么其他东西吗,比如字符串或整数作为字符串?我有两个大列表/数据帧,其中一些很长,整数,我尝试使用Map(int,dataset)若要将所有内容转换为一个,相同的错误列表索引必须是整数而不是列表