pandas - 有条件地连接两个数据帧
问题描述
我有两个数据框,这是其中之一,它包含去年的数据:
col1 col2 col3 col4
Type Date
type1 2020-01-01 1.0 2.0 3.0 4.0
2020-02-01 1.0 2.0 3.0 4.0
2020-03-01 1.0 2.0 3.0 4.0
2020-04-01 1.0 2.0 3.0 4.0
2020-05-01 1.0 2.0 3.0 4.0
type2 2020-01-01 1.0 2.0 3.0 4.0
2020-02-01 1.0 2.0 3.0 4.0
2020-03-01 1.0 2.0 3.0 4.0
2020-04-01 1.0 2.0 3.0 4.0
2020-05-01 1.0 2.0 3.0 4.0
type3 2020-01-01 1.0 2.0 3.0 4.0
2020-02-01 1.0 2.0 3.0 4.0
2020-03-01 1.0 2.0 3.0 4.0
2020-04-01 1.0 2.0 3.0 4.0
2020-05-01 1.0 2.0 3.0 4.0
type4 2020-01-01 1.0 2.0 3.0 4.0
2020-02-01 1.0 2.0 3.0 4.0
2020-03-01 1.0 2.0 3.0 4.0
2020-04-01 1.0 2.0 3.0 4.0
2020-05-01 1.0 2.0 3.0 4.0
type5 2020-01-01 1.0 2.0 3.0 4.0
2020-02-01 1.0 2.0 3.0 4.0
2020-03-01 1.0 2.0 3.0 4.0
2020-04-01 1.0 2.0 3.0 4.0
2020-05-01 1.0 2.0 3.0 4.0
另一个是新数据:
col1 col2 col3 col4
Type Date
type1 2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type2 2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type3 2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type4 2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type5 2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
如您所见,不同的只是日期和值。我每天都创建这个新数据,并且我想在某些条件下连接这两个数据帧。我想在这里看看去年的值进行比较。例如,由于我们目前是 2021 年 1 月,我只想在此处添加 2020 年 1 月的数据。当日期为 2 月时,此数据框不应再包含 2020 年 1 月的数据,而应仅包含 2020 年 2 月的数据。但是,我在这里添加所需的输出:
When the date is January 2021:
col1 col2 col3 col4
Type Date
type1 2020-01-01 1.0 2.0 3.0 4.0
2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type2 2020-01-01 1.0 2.0 3.0 4.0
2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type3 2020-01-01 1.0 2.0 3.0 4.0
2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type4 2020-01-01 1.0 2.0 3.0 4.0
2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type5 2020-01-01 1.0 2.0 3.0 4.0
2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
这样做的方法是什么?
解决方案
想法是将实际时间转换为月份周期Timestamp.to_period
,减去上一年的 12 并通过筛选第二级Date
选择Index.get_level_values
并转换为周期DatetimeIndex.to_period
:
now = pd.to_datetime('now').to_period('m') - 12
df11 = df1[ df1.index.get_level_values('Date').to_period('m') == now]
print (df11)
col1 col2 col3 col4
Type Date
type1 2020-01-01 1.0 2.0 3.0 4.0
type2 2020-01-01 1.0 2.0 3.0 4.0
type3 2020-01-01 1.0 2.0 3.0 4.0
type4 2020-01-01 1.0 2.0 3.0 4.0
type5 2020-01-01 1.0 2.0 3.0 4.0
最后添加到第二个 DataFrameconcat
并排序MultiIndex
:
df3 = pd.concat([df11, df2]).sort_index()
print (df3)
col1 col2 col3 col4
Type Date
type1 2020-01-01 1.0 2.0 3.0 4.0
2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type2 2020-01-01 1.0 2.0 3.0 4.0
2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type3 2020-01-01 1.0 2.0 3.0 4.0
2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type4 2020-01-01 1.0 2.0 3.0 4.0
2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
type5 2020-01-01 1.0 2.0 3.0 4.0
2021-01-01 10.0 20.0 30.0 40.0
2021-02-01 0.0 0.0 0.0 0.0
2021-03-01 0.0 0.0 0.0 0.0
2021-04-01 0.0 0.0 0.0 0.0
2021-05-01 0.0 0.0 0.0 0.0
推荐阅读
- swiftui - 如何在我的屏幕底部定位 HStack 不使用 spacer()
- scala - 如何在 Scala 项目上正确运行 SpotBugs
- python - 为什么 imwirte 函数按 BGR 顺序写入我的图像?
- swift - iOS - 使用集中对齐的 UILabel 文本约束到 UIImage
- macos - echo 程序打印换行符而不是 '\n'
- javascript - 如何在数组的特定元素上设置加载状态?
- angular - Angular DI 提供者与 viewProviders
- ios - 如何使用 SwiftUI 防止一个子视图的剪辑内容阻止底层子视图中的手势?
- swift - 具有基于字典的自定义绑定的 SwiftUI NavigationLink 在转换回来后无法重置
- python - 无法使用 pip 安装 Tensorflow 1.14.0(错误:未找到 tensorflow==1.14.0 的匹配分布)