(运行的干净代码)根据来自另一个数据帧的日期间隔和字符串条件获取一个数据帧中的值的平均值

Posted

技术标签:

【中文标题】(运行的干净代码)根据来自另一个数据帧的日期间隔和字符串条件获取一个数据帧中的值的平均值【英文标题】:(Clean code that runs) Getting the mean of values in one dataframe based on date interval and string condition from another dataframe 【发布时间】:2021-08-05 06:54:13 【问题描述】:

所以,我有一个正在运行的代码。但到目前为止,它是一团糟,我想清理它。论坛上也有人问过类似的问题,我从几篇帖子中获得了灵感,并为我的问题提出了以下解决方案。

我有一个包含大量数据的数据框。我希望能够获取此数据帧中值的平均值,如果它们对应于我的原始数据帧中的时间间隔和 sourceID id。然后将平均值输入到原始数据框中。为了简化问题,我在下面给出了一些小表格来说明问题。

包含数据的数据框: precip_data =

sourceID value referenceTime
France 3 2020-01-01
France 6 2020-02-01
France 5 2021-01-01
USA 10 2020-01-01
USA 6 2021-01-01

原始数据框: df =

date1 date2 Place
2020-02-01 2021-01-01 france
2020-01-01 2021-01-01 usa

输出应该是: df =

date1 date2 Place Precipitation
2020-02-01 2021-01-01 france 5.5
2020-01-01 2021-01-01 usa 8

我有解决问题的办法,但是我希望得到一些帮助以使其更容易:

#fetching data
P_china = precip_data[precip_data['sourceId'].str.contains("china")]
P_usa = precip_data[precip_data['sourceId'].str.contains("usa")]

# fetching corresponds cells
L_france = df.loc[df['Place'] == 'france'
L_usa = df.loc[df['Place'] == 'usa'

#calculating data value
df['Precip_france'] = L_france.apply(lambda s: P_france.query('@s.date1<= referenceTime<=@s.date2').value.mean(), axis=1) 
df['Precip_usa'] = L_usa.apply(lambda s: P_usa.query('@s.date1<= referenceTime <= @s.date2').value.mean(), axis=1)

#produces empty cell and thus i cant sum
df['Precip_usa'] = df['Precip_usa'].replace(np.nan, 0)
df['Precip_france'] = df['Precip_france'].replace(np.nan, 0)

#summing 0 values with value that i want
df['Precipitation'] = df['Precip_usa']+df['Precip_france']

# keeping values of interest
df = df.drop(['Precip_usa', 'Precip_france'], axis = 1)

不是必需的:但最好在数据框中添加某种排序,首先根据位置排序,然后根据参考时间排序为 100% 我正在提取正确的值。我已经在 excel 中检查了该文件,现在看起来还可以。但对于未来的应用,它可能是一个很好的实现。

【问题讨论】:

@AnuragDabas 这不是一个简单的合并问题,因为这里我们需要检查迭代的重叠。 @ShubhamSharma 回撤关闭投票 :) 感谢先生告知 【参考方案1】:

解决方案

# Create common merge key
df['key'] = df['Place'].str.lower()
precip_data['key'] = precip_data['sourceID'].str.lower()

# Left Merge the dataframes on common key
m = df.merge(precip_data, on='key', how='left')

# Test the inclusion of referenceTime in [date1, date2]
m['value'] = m['value'].mask(~m['referenceTime'].between(m['date1'], m['date2']))

# Groupby and aggregate the masked column value using mean
out = m.groupby(['date1', 'date2', 'Place'], as_index=False, sort=False)['value'].mean()

>>> out

       date1      date2   Place  value
0 2020-02-01 2021-01-01  france    5.5
1 2020-01-01 2021-01-01     usa    8.0

【讨论】:

以上是关于(运行的干净代码)根据来自另一个数据帧的日期间隔和字符串条件获取一个数据帧中的值的平均值的主要内容,如果未能解决你的问题,请参考以下文章

根据来自不同数据帧的行名将列从另一个数据帧复制到

熊猫,我怎样才能避免使用 iterrow (如何根据来自另一个数据帧的值将值分配给数据帧中的新列)

提高链接来自两个数据帧的数据的效率

使用来自另一个数据帧的代码重新索引数据帧

R根据来自另一个数据集的间隔填充新列(查找)

使用来自另一个数据帧的索引创建一个空数据帧