【问题标题】:Pandas Join creates unwanted duplicate, only want first instancePandas Join 创建不需要的重复项,只需要第一个实例
【发布时间】:2021-09-24 01:09:17
【问题描述】:

所以我有 2 个数据框,我通过它们重新定义的索引加入,这是我们用来识别研究的数字,当我加入它们时,它们看起来像这样:

df1(包含所有研究编号):

Index State PS
1001 CA 0
1002 NY 0
1003 NJ 1

df2(不包含所有研究编号且包含重复):

Index Study
1001 Active
1002 Active
1002 Closed

我目前有 df1 = df1.join(df2) 输出:

Index State PS Study
1001 CA 0 Active
1002 NY 0 Active
1002 NY 0 Closed
1003 NJ 1

在此示例 df 中,我希望仅将 df2 中的第一个 1002 实例与 df1 合并。假设它与“如何”或“开启”有关,但我对文档的理解不够好,因为我对 Pandas 还很陌生。谢谢! 期望的输出是:

Index State PS Study
1001 CA 0 Active
1002 NY 0 Active
1003 NJ 1

【问题讨论】:

  • 第一个记录 1002 在列研究中处于活动状态是巧合,还是对于您定义为第一个实例的所有条目都是如此?
  • 为什么 1002 的活动超过关闭?这里的逻辑是什么?
  • 并非所有第一个实例都将具有“活动”(即 1002 第一个实例可以关闭,第二个实例活动,第三个实例活动)但我只想要第一个实例,因为那是最近的一个。基本上 DF2 来自一个按最新到最旧排序的数据集,但没有日期。
  • @ScottBoston 看到我上面的评论。基本上 DF2 来自一个 2 列数据集,该数据集仅包含研究 # 和研究状态(活动或关闭)。第一个实例是最近的状态。没有日期是愚蠢的,或者在状态更新时没有删除先前的实例,但我无法控制。只是一般日志
  • @slicedorange7 如果对您有帮助,请批准以下解决方案:)

标签: python pandas dataframe


【解决方案1】:

尝试使用drop_duplicateskeep="first",因为它是从最新到最旧排序的。然后你在键上合并Index

df2 = df2.drop_duplicates(subset="Index", keep="first")
df = pd.merge(df1, df2, on="Index", how="left")

【讨论】:

  • 谢谢,除了我用过的 df2 之外,几乎都用过同样的东西:df2 = df2[~df2.index.duplicated(keep = "first")]
【解决方案2】:
import pandas as pd

dict1 = {
    'State': ['CA', 'NY', 'NJ'],
    'PS': [0, 0, 1]
}
dict2 = {
    'Study': ['Active', 'Active', 'Closed'],
}

df1 = pd.DataFrame(data=dict1, index=[1001, 1002, 1003])
df2 = pd.DataFrame(data=dict2, index=[1001, 1002, 1002])

print(df1)
print(df2)

answer = df1.join(df2).drop_duplicates(subset=['State', 'PS'], keep='first')

print(answer)

至关重要的是,drop_duplicates 方法应该能够处理这种特殊情况

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2012-07-23
    • 2018-10-13
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多