我有两个数据格式-- df1
和df2
。
df1 has row1,row2,row3,row4,row5
df2 has row2,row5
我想要一个新的数据格式,比如df1-df2
。也就是说,结果数据have应该有行为- row1,row3,row4
。
发布于 2016-07-31 07:24:04
您可以使用pandas.concat
将这两个数据帧按行连接,然后使用drop_duplicates
删除它们中的所有重复行。
In [1]: import pandas as pd
df_1 = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df_2 = pd.DataFrame({"A":["foo", "bar", "foo", "bar"], "B":[1,0,1,0], "C":["A","B","A","B"]})
In [2]: df = pd.concat([df_1, df_2])
In [3]: df
Out[3]:
A B C
0 foo 0 A
1 foo 1 A
2 foo 1 B
3 bar 1 A
0 foo 1 A
1 bar 0 B
2 foo 1 A
3 bar 0 B
In [4]: df.drop_duplicates(keep=False)
Out[4]:
A B C
0 foo 0 A
2 foo 1 B
3 bar 1 A
发布于 2016-07-31 06:47:53
您可以使用index.difference()
函数
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.random.randn(5, 2), index= ['row' + str(i) for i in range(1, 6)])
df1
0 1
row1 0.249451 -0.107651
row2 1.295390 -1.773707
row3 -0.893647 -0.683306
row4 -1.090551 0.016833
row5 0.864612 0.369138
df2 = pd.DataFrame(np.random.randn(2, 2), index= ['row' + str(i) for i in [2, 5]])
df2
0 1
row2 0.549396 -0.675574
row5 1.348785 0.942216
df1.loc[df1.index.difference(df2.index), ]
0 1
row1 0.249451 -0.107651
row3 -0.893647 -0.683306
row4 -1.090551 0.016833
发布于 2020-08-18 23:17:32
这是最好的方法:
df = df1.drop_duplicates().merge(df2.drop_duplicates(), on=df2.columns.to_list(),
how='left', indicator=True)
df.loc[df._merge=='left_only',df.columns!='_merge']
注意,drop复制用于最小化比较。没有他们,它也会起作用。
为什么这是最好的方法?
最好的方法是比较行内容本身,而不是索引或一/两列,同样的代码也可以用于其他过滤器,如“两者”和“right_only”,以获得类似的结果。
pandas.concat()
与drop_duplicated()
不太理想,因为它也将消除那些可能只存在于您想要保留的数据文件中的行,并且由于有效的原因而被复制。https://stackoverflow.com/questions/38681340
复制相似问题