我有两个数据集如下
A B
IDs IDs
1 1
2 2
3 5
4 7
如何在Pandas,Numpy中我们可以应用一个可以给我B的所有数据的连接,这在A中不存在 跟随
之类的东西B
Ids
5
7
我知道可以用for循环完成,但我不想要,因为我的真实数据是数百万,而我真的不确定如何在这里使用Panda Numpy,类似于
pd.merge(A, B, on='ids', how='right')
谢谢
答案 0 :(得分:3)
您可以使用NumPy's setdiff1d
,就像这样 -
np.setdiff1d(B['IDs'],A['IDs'])
此外,np.in1d
可以用于相同的效果,如此 -
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
答案 1 :(得分:2)
您可以将merge
与参数indicator
一起使用,然后再使用boolean indexing
。最后您可以drop
列_merge
:
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
答案 2 :(得分:1)
您可以将数据系列转换为集合并取得差异:
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
答案 3 :(得分:1)
您只需使用pandas'def zeros(n)
zeros = 0
zeros += n /= 5 while n >= 1
zeros
end
方法:
.isin()
如果这些是单独的DataFrames:
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'])]