【发布时间】:2020-05-03 17:32:34
【问题描述】:
我是 pandas 的新手,我尝试过阅读文档并尝试各种示例,但我正在解决的这个问题真的让我很难过。
我有以下两个数据框 (DataA/DataB),我想按 global_index/item/values 合并它们。
DataA DataB
row item_id valueA row item_id valueB
0 x A1 0 x B1
1 y A2 1 y B2
2 z A3 2 x B3
3 x A4 3 y B4
4 z A5 4 z B5
5 x A6 5 x B6
6 y A7 6 y B7
7 z A8 7 z B8
项目列表(item_ids) 是有限的,两个数据帧中的每一个都代表给定 global_index 值的项目的特征值(特征 A,特征 B)。
global_index 大致可以认为是一个“时间”单位
每个数据帧(DataA/DataB)和 global_index 之间的映射是通过以下两个映射器 DF 完成的:
DataA_mapper
global_index start_row num_rows
0 0 3
1 3 2
3 5 3
DataB_mapper
global_index start_row num_rows
0 0 2
2 2 3
4 5 3
简单地说,对于给定的 global_index(例如:1),映射器会将行列表定义到与该 global_index 关联的各个 DF(DataA 或 DataB)中。
例如,对于 0 的 global_index 值:
- 在 DF DataA 中,行 0..2 与 global_index 0 相关联
- 在 DF DataB 中,行 0..1 与 global_index 0 相关联
另一个例子,global_index 值为 2:
- 在 DF DataB 中,行 2..4 与 global_index 2 相关联
- 在 DF DataA 中没有与 global_index 2 关联的行
显示的范围 [start_row,start_row + num_rows) 不相互重叠,并代表各自数据帧(DataA,DataB)中唯一的行序列/范围
简而言之,DataA 或 DataB 中的任何行都不会在多个范围内找到。
我想合并 DF,以便获得以下数据框:
row global_index item_id valueA valueB
0 0 x A1 B1
1 0 y A2 B2
2 0 z A3 NaN
3 1 x A4 B1
4 1 z A5 NaN
5 2 x A4 B3
6 2 y A2 B4
7 2 z A5 NaN
8 3 x A6 B3
9 3 y A7 B4
10 3 z A8 B5
11 4 x A6 B6
12 4 y A7 B7
13 4 z A8 B8
在最终的数据帧中,任何一对 global_index/item_id 都会有:
- valueA 和 valueB 的值
- 仅用于 valueA 的值
- 仅用于 valueB 的值
要求如果给定的 global_index/item 只有一个值(例如:valueA 但没有 valueB),则要使用的缺失值的最后一个值。
【问题讨论】:
-
您能否以易于使用的格式分享一些示例数据?
-
@AMC - 当然我可以做到,尽管上面的示例没有传达结构 - 我遇到的问题是将映射器框架与数据帧 A/B 相关联 - 因为它们是只有 dataA/B 帧与 global_index 的关系。
-
在合并的 DF 中,我不明白
global_index == 2时你是如何获得valueA值的,即使它没有列在DataA_mapper表中,你能解释一下 @Lucinda里杰蒂? -
我不是很了解最后一个要求。因此,对于 global_index 2,DataA 中没有关联的行,但是当它们合并时,您将 valueA 显示为该全局索引的 A4、A2 和 A5。这样做的逻辑是什么?
-
@K753 我同意。对于这个问题中给出的数据,上面的预期输出是否正确?
标签: python pandas dataframe join merge