【问题标题】:Any way to correctly merge two time series with different dims in pandas?有什么方法可以正确合并熊猫中具有不同暗度的两个时间序列?
【发布时间】:2020-09-10 00:09:24
【问题描述】:

我打算在 pandas 中加入两个不同维度的时间序列。第一个时间序列是关于covid19每日病例数据,而第二个时间序列是食品加工厂的每日切割统计数据,然后我想通过其公共列将合并的数据框与另一个数据连接起来。首先,我想按特定规格加入他们。在covid病例时间序列中,数据是按县级记录的,而在日切时间序列中,有日切统计数据,可以是每个县的平均日切时间序列,也可以是均匀分布的。为了使加入这两个时间序列更合乎逻辑,我做了一些聚合并尝试加入,但它没有按我预期的那样工作。任何人都可以建议在熊猫中实现这一点的可能方法吗?有什么想法吗?

当前的尝试和可重现的数据

这里是 covid time series data in gist 来自 NYT covid19 数据,daily cut time series 来自食品加工机构。这是我目前的尝试:

import pandas as pd

df1= pd.read_csv("us_covid_by_counties.csv")
df1 = df1.drop(columns=['Unnamed: 0'], inplace=True) 

df2= pd.read_csv("daily_cut.csv")
df2 = df2.drop(columns=['Unnamed: 0'], inplace=True)

## process and aggregate covid time series
ctyList = list(df1['county'].unique())
df1_new= {}
for c in ctyList:
    cty_df = df1[df1['county']==c]
    cty_df['new_cases'] = cty_df['cases'].diff()
    cty_df['new_deaths'] = cty_df['deaths'].diff()
    df1_new[c] = cty_df

df1_new = pd.DataFrame.from_dict(df1_new, orient='index')

然后,我尝试以这种方式合并它们:

df_merged = pd.concat([df1_new , df2]).sort_values('date').reset_index(drop=True)

更新

如果合并df1_newdf2 可以正确完成,我想通过county_state 再次加入df_mergedthis data。有什么办法可以在 pandas 中做到这一点?

但我很难正确加入这两个时间序列。任何人都可以提出任何可能的想法来完成这项工作吗?有什么可能的想法吗?

【问题讨论】:

  • 请检查 pandas pandas.merge_asof 合并选项。像这样pd.merge_asof(df1, df2, on="time_column", direction='nearest')

标签: python pandas dataframe


【解决方案1】:

在您最初的问题中,您提到了两个数据框。在您的评论中,您提到了另一个数据框。这是一个不同的问题吗? merge_asof 适用于您的原始数据集。请看下文

这是将数据类型更改为日期时间

df1['date'] = pd.to_datetime(df1['date'])
df2['date'] = pd.to_datetime(df2['date'])

这是我得到的输出

【讨论】:

  • 谢谢。只是出于好奇,将上述尝试的输出与this data 结合起来的最佳方法是什么?任何想法?谢谢!
  • 您尝试df1.merge(df2, on = 'county_state', how='inner') 了吗,其中 df1 是您使用时间合并的第一个数据集,而 df2 是您在上面的链接中显示的新数据集。
  • 对,我试过了,但我认为加入输出对我来说不合适。我也试过右加入。也许你可以提出正确的方法来做到这一点。您能否展示如何正确使用this data 合并数据帧?非常感谢:)
【解决方案2】:

在 cmets 中完成@XXavier 的建议:

确保正确导入日期:

df1 = pd.read_csv('data/us_covid_by_counties.csv', parse_dates=['date']).drop(columns=['Unnamed: 0'])
df2 = pd.read_csv('data/daily_cut.csv', parse_dates=['date']).drop(columns=['Unnamed: 0'])

添加你想要的列:

df1['new_cases'] = df1.groupby(['county'])['cases'].diff()
df1['new_deaths'] = df1.groupby(['county'])['deaths'].diff()

创建合并的df:

df_merged = pd.merge_asof(df1, df2, on="date", direction='nearest')

【讨论】:

  • 谢谢。我尝试使用this data 加入df_merged,但使用pd.merge_asof() 不起作用。我应该怎么办?任何想法?谢谢:)
猜你喜欢
  • 1970-01-01
  • 2020-08-06
  • 2019-07-16
  • 2021-11-20
  • 2016-08-12
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多