Pandas:无法对DataFrame执行减法,如何提取df1中独有的行?
提取DataFrame独有行时的错误分析与解决方法
数据情况
df1内容:
colA colB 0 e5b1b9fc-ade9-4501-a66b-ef2ecd57483e.d9967f258... 2ZWR52QYZ86H 1 8d127d82-cfa4-421f-9081-cf35132b8248.f0865b3b9... 61RPLMR5BFFT 2 005c8e84-98b4-402d-a24e-6a63edad0598.16b6f0f9f... 7L256IQTB1M1 3 d87f6dfd-1c55-4ce5-9b84-e80b6aa958d8.3f0901c7f... 3H9SLNATBJ01 4 cf89c9dd-004e-40e7-8120-3397ce5fd97e.f571bc175... 4Z8RT5VZNOQ8 5 9eebc606-e8d0-40e3-9ba5-6d3e1b77bc64.0dc42d528... 1DEOAHZL2JFC 6 7112aef1-5fa0-4459-aa1b-15cba2f96ec5.6a9ecb28d... 2CIISYGAAV69 7 e30d901c-34e6-4974-9b9e-1fe206ed6fca.701f1358e... 2NLLJ70RXKW2 8 13677989-8979-4422-a471-7fda22ea4f6d.e00051e45... 6P60G721DVHK
df2内容:
0 e5b1b9fc-ade9-4501-a66b-ef2ecd57483e.d9967f258... 2ZWR52QYZ86H 1 8d127d82-cfa4-421f-9081-cf35132b8248.f0865b3b9... 61RPLMR5BFFT 2 005c8e84-98b4-402d-a24e-6a63edad0598.16b6f0f9f... 7L256IQTB1M1 3 d87f6dfd-1c55-4ce5-9b84-e80b6aa958d8.3f0901c7f... 3H9SLNATBJ01 4 cf89c9dd-004e-40e7-8120-3397ce5fd97e.f571bc175... 4Z8RT5VZNOQ8
错误操作与报错信息
尝试用以下代码提取df1中不存在于df2的行:
df1.subtract(df2)
出现错误:
result[mask] = op(xrav[mask], yrav[mask]) TypeError: unsupported operand type(s) for -: 'str' and 'str'
错误原因
subtract()方法的作用是对两个DataFrame的数值型列执行逐元素减法运算,而你的DataFrame中colA和colB都是字符串类型,字符串不支持减法操作,因此抛出类型错误。而且这个方法本身就不是用来筛选差异行的工具。
正确解决方法
下面提供几种常用的提取df1独有行的方式:
方法1:使用merge进行左连接并筛选
# 左连接后筛选df2中匹配不到的行 diff_df = df1.merge(df2, on=['colA', 'colB'], how='left', indicator=True) diff_df = diff_df[diff_df['_merge'] == 'left_only'].drop('_merge', axis=1)
方法2:使用isin结合布尔索引
# 先将每行转为元组,再判断是否不在df2的行集合中 df1_rows = df1.apply(tuple, axis=1) df2_rows = df2.apply(tuple, axis=1) diff_df = df1[~df1_rows.isin(df2_rows)]
方法3:使用concat+drop_duplicates
# 合并两个DataFrame后删除重复行,保留只出现一次的行 combined = pd.concat([df1, df2]) diff_df = combined.drop_duplicates(keep=False)
内容的提问来源于stack exchange,提问作者AbtPst
相关产品推荐
相关产品推荐

