pandas 基于列将多个框相互比较,仅返回不匹配的离群值

hk8txs48  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(73)

创建一个日终对账流程,以确保在工作日结束时没有离群值。这有点复杂,因为我需要将多个框相互比较,只留下不重复的值(aka outliers).我试图比较df 1到/从df 2.还试图比较df 1到/从df 3.所有三个嵌套有两列:ID,来源。ID列由不同的特征组成,例如金额(负数或正数),9位数和人。具有正负金额的示例如下所示:20_777666333_bob或-1000_932143097_john。
范例:如果我正在比较df 1和df 2。如果df 1在ID列= 20_777666333_bob中有一个值,而df 2在ID列= 20_777666333_bob中没有匹配的值,那么我希望离群值在它自己的框架中返回为20_777666333_bob,我稍后将使用它来填充电子邮件。
下面是我正在努力的当前逻辑。如果有人知道为什么它返回所有重复而没有异常值,那将是非常有帮助的。此外,如果有人有一个不同的编码想法,我洗耳恭听。谢谢你的时间。

# List of dataframes
dataframes = [df1, df2, df3]

# Iterate through dataframes and drop duplicates
for i, df in enumerate(dataframes, start=1):
    dataframes[i-1] = df.drop_duplicates(subset='ID')

# Display the updated dataframes
for i, df in enumerate(dataframes, start=1):
    print(f"DataFrame {i} after dropping duplicates:")
    print(df)
    print()

字符串
更新后的文章更好的例子,以帮助回答我的问题。
“”df1 = pd.DataFrame({“ID”:[20_777666333_bob,-1000_932143097_john,-5_987443211_jane],“Source”:[“A”]})df2 = pd.DataFrame({“ID”:[440_098742123_jim,680_715355572_bill,20_777666333_bob],“Source”:[“B”]})df3 = pd.DataFrame({“ID”:[680_715355572_bill,-1000_932143097_john,-900_976165534_sean],“Source”:[“C”]})
x = pd.concat([df1,df2,df3]).drop_duplicates(subset='ID',keep=False)
'''
我希望我的outlier rame(x)有3个outliers:

  1. ID =-5_987443211_jane,源A
  2. ID = 440_098742123_jim,源B
  3. ID =-900_976165534_sean,源C
    目前,当我使用上述逻辑时,我仍然看到离群值,而我希望不会。这可能与ID列的数据类型有关吗?当我concat它们时,df 1,df 2和df 3都转向ID列的datatype = object,但在我concat它们之前,df 1 = object,df 2 = string和df 3 = string。
gblwokeq

gblwokeq1#

这里有一个解决方案可能对您有用,它涉及到合并多个嵌套框并删除正确合并的行。

import pandas as pd

df1 = pd.DataFrame({"ID": [1,2,3,4,5], "Source": ["A", "B", "C", "D", "E"]})
df2 = pd.DataFrame({"ID": [1,3,4,5], "Source": ["aa", "cc", "dd", "ee"]})
df3 = pd.DataFrame({"ID": [1,2,3,4,9], "Source": ["aa", "bb", "cc", "dd", "ii"]})

outliers_list = []
for curr_df in [df2, df3]:
  curr_outliers = df1.merge(curr_df, on="ID", how="outer", indicator=True)
  print(curr_outliers.head())
  curr_outliers = curr_outliers[curr_outliers._merge != "both"]
  curr_outliers.drop(columns=['_merge'], inplace=True)
  outliers_list.append(curr_outliers.copy())

outliers = pd.concat(outliers_list)
print(outliers.head())

字符串

相关问题