【问题标题】:pandas/python: search loops between 2 df and input end result to new dfpandas/python:在 2 个 df 之间搜索循环并将最终结果输入到新的 df
【发布时间】:2021-10-27 03:20:18
【问题描述】:

是否可以使用两个不同的 df(s) 创建一个“搜索”循环(在一个范围内,例如:iloc 0 到 10、0 到 21 等 ..)并将最终结果输入到一个新的 df 中。

以下是我使用的手动方法。但是,它的效率非常低。

ndf0 = df[(df['result'] == rc.iloc[0]['result'])].drop_duplicates(['result'], keep='last')
ndf1 = df[(df['result'] == rc.iloc[1]['result'])].drop_duplicates(['result'], keep='last')
ndf2 = df[(df['result'] == rc.iloc[2]['result'])].drop_duplicates(['result'], keep='last')
ndf3 = df[(df['result'] == rc.iloc[3]['result'])].drop_duplicates(['result'], keep='last')
ndf4 = df[(df['result'] == rc.iloc[4]['result'])].drop_duplicates(['result'], keep='last')
ndf5 = df[(df['result'] == rc.iloc[5]['result'])].drop_duplicates(['result'], keep='last')
ndf6 = df[(df['result'] == rc.iloc[6]['result'])].drop_duplicates(['result'], keep='last')
ndf7 = df[(df['result'] == rc.iloc[7]['result'])].drop_duplicates(['result'], keep='last')
ndf8 = df[(df['result'] == rc.iloc[8]['result'])].drop_duplicates(['result'], keep='last')
..etc...

frames = [ndf0, ndf1, ndf2, ndf3, ndf4, ndf5, ndf6, ndf7, ndf8, etc..]
result = pd.concat(frames)

非常感谢,问候

示例表:

df

╔════════╦════════╗ ║结果║评分║ ╠════════╬════════╣ ║紫║11║ ║蓝色║33║ ║黄色║54║ ║绿色║55║ ║红色║64║ ║棕色║37║ ║白色║95║ ║黄金║99║ ║ 棕褐色 ║ 47 ║ ║黑色║67║ ╚════════╩════════╝

rc

╔════════╗ ║结果║ ╠════════╣ ║蓝色║ ║黄色║ ║红色║ ║晒黑║ ║白色║ ╚════════╝

ndf

╔════════╦════════╗ ║结果║评分║ ╠════════╬════════╣ ║蓝色║33║ ║黄色║54║ ║红色║64║ ║ 棕褐色 ║ 47 ║ ║白色║95║ ╚════════╩════════╝

【问题讨论】:

  • rc 看起来像什么?您能否使用df['result'].head(10)rc['result'].head(5) 的输出更新您的帖子以创建一个可重现的示例?
  • 嗨@Corralien,我已经用表格更新了我的帖子,希望它能更好地了解问题

标签: python pandas dataframe


【解决方案1】:

您似乎想从df中选择一部分数据,条件是df['result']的值包含在rc['result']中。

如果是这样,也许您可​​以使用掩码来选择它们,然后删除保留最后一行的重复项。

试试这个:

mask = (df['result'].isin(rc['result'].to_list()))
new_df = df[mask].drop_duplicates(['result'], keep='last')

希望能给你一些帮助。

【讨论】:

  • 感谢您的建议。是否可以让输出使用来自 rc['result'] 的序列?
  • 我将关键字keeping 替换为keep
  • 谢谢。我没有注意到那个错误。 :)
【解决方案2】:

嗯....这不是直接工作吗?

df = df[[rc.columns.tolist()]]

【讨论】:

  • 它应该做什么?
【解决方案3】:

使用merge:

>>> rc.merge(df, on='result', how='left').drop_duplicates('result', keep='last')

   result  rating
0    blue      33
1  yellow      54
2     red      64
3     tan      47
4   white      95

注意:在您的示例中,您没有重复。

【讨论】:

  • 这很好用,但是,没有删除重复项,我必须添加另一行:df1 = df1.drop_duplicates(['result'], keep='last')
  • 我只使用了一个简短的样本,原来的 df 有很多重复
  • 我修正了我的答案。我在drop_duplicates 中忘记了'results'。如果您只有一列要检查,则不必使用序列语法['results']
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
相关资源
最近更新 更多