【发布时间】:2021-04-03 14:56:19
【问题描述】:
我需要重塑我的 df。
这是我的输入 df:
import pandas as pd
import datatable as dt
DF_in = dt.Frame(name=['name1', 'name1', 'name1', 'name1', 'name2', 'name2', 'name2', 'name2'],
date=['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06', '2021-01-07', '2021-01-08'],
type=['a', 'b', 'a', 'b', 'b', 'a', 'b', 'a'],
value=[1, 2, 3, 4, 5, 6, 7, 8])
| name date type value
-- + ----- ---------- ---- -----
0 | name1 2021-01-01 a 1
1 | name1 2021-01-02 b 2
2 | name1 2021-01-03 a 3
3 | name1 2021-01-04 b 4
4 | name2 2021-01-05 b 5
5 | name2 2021-01-06 a 6
6 | name2 2021-01-07 b 7
7 | name2 2021-01-08 a 8
这是所需的输出df:
DF_out = dt.Frame(name=['name1', 'name1', 'name2', 'name2'],
date_a=['2021-01-01', '2021-01-03', '2021-01-06', '2021-01-08'],
date_b=['2021-01-02', '2021-01-04', '2021-01-07', None],
value_a=[1, 3, 6, 8],
value_b=[2, 4, 7, None])
| name date_a date_b value_a value_b
-- + ----- ---------- ---------- ------- -------
0 | name1 2021-01-01 2021-01-02 1 2
1 | name1 2021-01-03 2021-01-04 3 4
2 | name2 2021-01-06 2021-01-07 6 7
3 | name2 2021-01-08 NA 8 NA
如有必要,可以将数据表帧转换为熊猫数据帧:
DF_in = DF_in.to_pandas()
转换:
- 这是一个分组转换。分组列是“名称”。
- df 已排序
- 每组的行数不同,可以是偶数,也可以是奇数
- 如果组中的第一行在“类型”列中有“b”,则必须将其删除(例如:DF_in 中的第 4 行)
- 也可能组中的最后一行在“type”列中有一个“a”,此行不应丢失(例如:DF_in 中的第 7 行)
我希望这个解释是可以理解的。
提前谢谢你
【问题讨论】:
-
鉴于
name1是前两行中name的值,为什么2021-01-04匹配2021-01-03而不是2021-01-01的日期和4到3而不是1以获取价值?这仅仅是接近吗? -
确实是接近。 df 已排序,如果列“type”中包含值“a”的行包含值“b”,则该行应与其下方的行匹配。这必须按组进行。它变得有点困难,因为每组的行数并不总是均匀的,而且它们并不总是以值“a”开始并以“type”列中的值“b”结束。
-
@k_n_c 你对这个问题有什么想法吗?
标签: python pandas dataframe reshape py-datatable