外python中加入熊猫
我有两个数据集如下外python中加入熊猫
A B
IDs IDs
1 1
2 2
3 5
4 7
如何在熊猫,numpy的,我们可以申请一个连接,可以给我从B,这是不存在的 东西全部数据像下面
B
Ids
5
7
我知道它可以与循环来实现,但我不想,因为我真正的数据是数以百万计,而且我真的不知道如何在这里使用熊猫numpy的,像以下
pd.merge(A, B, on='ids', how='right')
感谢
可以使用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
您可以使用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
非常感谢!但尽管我有几次尝试:“我收到错误,列表索引必须是整数而不是列表” –
@manusharma那么,除了'IDs'这一列中的整数之外,还有其他任何东西,比如可能是字符串还是整数? – Divakar
我有两个大型的List/Dataframe,其中一些是long,Integers,我试图用Map(int,dataset)把所有的都转换成一个,还是一样的错误List Indices必须是整数而不是列表 –
您可以在数据序列转换成集,并采取区别:
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
你可以只需使用熊猫'.isin()
方法:
df = pd.DataFrame({'A' : [1,2,3,4], 'B' : [1,2,5,7]})
df[~df['B'].isin(df['A'])]
如果这些单独DataFrames:
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'。 – shivsn
预期产量是多少?列名似乎是A和B,而不是ID ......这是误导。 –