我有两个原始的dfs,输出相同的列数,但行数不同。
import pandas as pd
original = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
output = pd.DataFrame({'A': [1, 2, 4,9], 'B': [4, 5, 7,8]})
原创
A B
1 4
2 5
3 6
输出
A B
1 4
2 5
4 7
9 8
我想比较输出与原始的,并获得额外的行(最后两行在这个例子中)从输出中没有匹配的原始。
diff_df
A B
4 7
9 8
我已经尝试了一些stackoverflow建议使用concat,合并等,但没有得到我想要的,有人可以帮助吗?尝试了一些东西使用pyspark以及,但没有运气,任何解决方案使用pyspark或Pandas是好的
6条答案
按热度按时间n3h0vuf21#
可以使用
merge
和query
:无过滤:
更多关于merge dataframes
ct2axkht2#
在pandas中,你可以在merge中使用indicator参数:
它将创建一个附加列,其中包含记录来自哪个表的信息。然后可以使用它来获取必要的记录。
在pyspark中,你可以使用anti join:
esyap4oy3#
将pandas导入为pd
original = pd.DataFrame('A':[1,2,3],“B”:[4、5、6]})
输出= pd.DataFrame(“A”:[1,2,4,9],“B”:[4、5、7、8]})
def g(original,output):
diff_df = g(original.copy(),output.copy())print(diff_df)
输出量:
| 一|B|
| --|--|
| 4 | 7 |
| 9 | 8 |
此解决方案的工作原理是首先创建一个新的嵌套框架diff_df,它是输出嵌套框架的副本。然后,我们使用~output.isin(original).all(axis=1)表达式来选择diff_df中在original中没有匹配行的行。all(axis=1)函数返回True,如果一行中的所有值也存在于另一行中,否则返回False。
然后使用loc函数从diff_df中提取选定的行,并将它们作为一个新的中间帧返回。
r8uurelv4#
DataFrame.subtract(other: pyspark.sql.dataframe.DataFrame)
返回一个新的DataFrame,其中包含此DataFrame中的行,但不包含其他DataFrame中的行
hsgswve45#
关于Pandas的一句俏皮话:
在仔细调整
original
的大小以适合output
的大小之后,此操作将查看不同的行。重索引,因为它添加了一些
NaN
来填充新的行,负责列'int' dtype变成'float'。如果你的实际数据真的是整数,并且你想保持它的整数,那么在.dropna()
之后添加.astype('int')
:关于dtype在增加索引时不守恒的更多信息:例如Is there a way to prevent dtype from changing from Int64 to float64 when reindexing/upsampling a time-series?。
qrjkbowd6#
试试这个: