【问题标题】:How to Extract Specific Values from Iterating Through Two Dataframes and Dynamically Append?如何从遍历两个数据框并动态追加中提取特定值?
【发布时间】:2022-01-23 22:03:31
【问题描述】:

我正在尝试执行一种多步骤方式,使用现有数据框中的值来创建子数据框(或系列),并将这些值与现有数据框进行比较,最终在原始数据框中创建一个新列。

一步一步的过程是:

  • 创建一个数据帧,根据原始数据帧 df1 中的日期隔离每个月内的最小日期 (df2),并且已成功创建。
  • 第二步是将 actual_date (df1) 匹配到 min_date (df2) 的位置,然后取 extract_value ( df1) 并将其存储在 df1 中,用于实际日期与 min_date 匹配的所有实例。

我尝试过但收到错误的一些尝试是: 比较 dfs 之间的日期值:

df1.loc[df1['actual_date']==df2[df2['min_date']]
#Produces unexpected EOF while parsing
df['actual_date']==df2['min_date']
#Produces ValueError: Can only compare identically-labeled Series objects

遍历条件:

for each in range(len(df1):
    if df1[df1['actual_date']]==df2[df2['min_date']]:
        df1['exctract_value_new']=df2['extract_value']

#Produces: KeyError: "None of [DatetimeIndex....are in the [columns]"

我已尝试搜索值和键错误,但无法理解有关索引的线程。具体来说,我不确定如何重新格式化 df1 和/或 df2 以便以这种方式比较日期值,然后根据两个数据帧中的条件何时匹配来提取单独的列。

这是使用的示例数据:

df1(基础)

actual_date extract_value
2021-01-22 22
2021-01-23 24
2021-01-24 15
2021-02-22 16
2021-02-05 34
2021-02-04 18

df2

month min_date
2021-01-01 2021-01-22
2021-02-01 2021-02-04
2021-03-01 2021-03-01

df1 的最终目标

actual_date min_date extract_value_new extract_value_original
2021-01-22 2021-01-22 22 22
2021-01-23 2021-01-22 22 24
2021-02-04 2021-02-04 18 18
2021-02-05 2021-02-04 18 34

感谢任何帮助!

【问题讨论】:

标签: python pandas


【解决方案1】:

您可能想查看pd.merge_asof...这里的解决方案给了我想要的表格!

merge_asof 本质上让我们可以加入两列中“最接近”的值。

import pandas as pd
import requests
from datetime import datetime, timedelta


df1 = pd.read_csv('df1.csv')
df2 = pd.read_csv('df2.csv')

datetime_format = '%Y-%m-%d'  # format of date (needs to be a datetime to merge in pandas)
tolerance = timedelta(days=1)  # the tolerance to join dates on

# convert our dates
df1['actual_date'] = pd.to_datetime(df1['actual_date'], format=datetime_format)
df2['min_date'] = pd.to_datetime(df2['min_date'], format=datetime_format)

# sort...
df1.sort_values(by='actual_date', inplace=True)

out = pd.merge_asof(df1, df2, left_on='actual_date', right_on='min_date', tolerance=tolerance).dropna()

给我:

  actual_date  extract_value       month   min_date
0  2021-01-22             22  2021-01-01 2021-01-22
1  2021-01-23             24  2021-01-01 2021-01-22
3  2021-02-04             18  2021-02-01 2021-02-04
4  2021-02-05             34  2021-02-01 2021-02-04

【讨论】:

  • 感谢您的宝贵时间——我试过了,但是目标值是“extract_value_new”列。因此,在您的“输出”中,actual_date 2021-01-23 的索引 [1] 将具有 extract_value_new = 22。我作为 df2 工作的 min_date 是参考数据帧。
  • @bytebybyte 我没有足够的上下文来理解这个问题,extract_value_new 是如何计算的?不是存储在df2吗?上面的代码将在最近的日期将这两个数据框合并在一起,这就是我解释您的问题的方式。您可以随时将 extract_value 中的 df2 重命名为其他名称,然后合并数据框中重命名列的所有值将是您要查找的内容。
  • extract_value_new 将是我们要创建的最后一列,它应该反映原始 df1 中实际日期 (df1) 与 min_date (df2) 匹配的条件下的“extract_value”值。例如,2022 年 2 月 4 日的提取值为 18,并且与 df2 中的 min_date 匹配。因此,在 2022 年 2 月 5 日的 df1 中,extract_value_NEW 也将显示 18。2 月的任何实际日期 (df1) 都应为 extract_value_new 显示 18。抱歉,如果上下文不是很清楚,请告诉我这是否有助于澄清?
猜你喜欢
  • 2016-07-14
  • 1970-01-01
  • 2021-08-04
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多