重新排列 Pandas 数据框、拆分行和转置
Rearrange Pandas Dataframe, split rows and transpose
我想转换具有这种格式的 Datafram:
df = pd.DataFrame({"Date": ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
"A1": [1, 2, 2, 2],
"A2": [9, 2, 2, 3],
"A3": [1, 3, 2, 9],
"B1": [1, 8, 2, 3],
"B2": [3, 8, 9, 3],
"B3": [2, 4, 5, 5]})
Date
A1
A2
A3
B1
B2
B3
2021-01-01
1
9
1
1
3
2
2021-01-02
2
2
3
8
8
4
2021-01-03
2
2
2
2
9
5
2021-01-04
2
3
9
3
3
5
我想要创建的 table,仅以行中的字母开头。
我的想法如下:
- 在每一行有日期后添加 2 个虚拟行
- 将 (X2) 和 (X3) 中的值复制到相同日期的虚拟行中
- 删除列 (X2) 和 (X3)
- 转置整个table
目标格式如下所示:
Date
2021-01-01 (1)
2021-01-01 (2)
2021-01-02 (3)
2021-01-02 (4)
2021-01-02 (5)
2021-01-02 (6)
2021-01-03 1 (7)
2021-01-03 (8)
2021-01-03 (9)
A
1
9
1
2
3
8
2
2
2
B
1
3
2
8
8
4
2
9
5
我无法让它工作,稍后我会尝试 post 代码。
有没有更干净、更快速的方法?
感谢您的帮助!
使用melt
获取long格式为每个类别构造对应的日期格式:
df = pd.melt(df, id_vars='Date') # in each row: 2021-01-01 | A1 | 1
df['idx'] = df['variable'].str[:-1] # A, B, ...
df['Date'] = df['Date'].astype(str) + ' (' + df['variable'].str[-1] + ')'
df = df[['Date', 'idx', 'value']].pivot(values='value', index='idx', columns='Date')
如果您不想显示列,请设置df.index.name = None
:
Date 2021-01-01 (1) 2021-01-01 (2) 2021-01-01 (3) 2021-01-02 (1) 2021-01-02 (2) 2021-01-02 (3) 2021-01-03 (1) 2021-01-03 (2) 2021-01-03 (3) 2021-01-04 (1) 2021-01-04 (2) 2021-01-04 (3)
A 1 9 1 2 2 3 2 2 2 2 3 9
B 1 3 2 8 8 4 2 9 5 3 3 5
我想转换具有这种格式的 Datafram:
df = pd.DataFrame({"Date": ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
"A1": [1, 2, 2, 2],
"A2": [9, 2, 2, 3],
"A3": [1, 3, 2, 9],
"B1": [1, 8, 2, 3],
"B2": [3, 8, 9, 3],
"B3": [2, 4, 5, 5]})
Date | A1 | A2 | A3 | B1 | B2 | B3 |
---|---|---|---|---|---|---|
2021-01-01 | 1 | 9 | 1 | 1 | 3 | 2 |
2021-01-02 | 2 | 2 | 3 | 8 | 8 | 4 |
2021-01-03 | 2 | 2 | 2 | 2 | 9 | 5 |
2021-01-04 | 2 | 3 | 9 | 3 | 3 | 5 |
我想要创建的 table,仅以行中的字母开头。 我的想法如下:
- 在每一行有日期后添加 2 个虚拟行
- 将 (X2) 和 (X3) 中的值复制到相同日期的虚拟行中
- 删除列 (X2) 和 (X3)
- 转置整个table
目标格式如下所示:
Date | 2021-01-01 (1) | 2021-01-01 (2) | 2021-01-02 (3) | 2021-01-02 (4) | 2021-01-02 (5) | 2021-01-02 (6) | 2021-01-03 1 (7) | 2021-01-03 (8) | 2021-01-03 (9) |
---|---|---|---|---|---|---|---|---|---|
A | 1 | 9 | 1 | 2 | 3 | 8 | 2 | 2 | 2 |
B | 1 | 3 | 2 | 8 | 8 | 4 | 2 | 9 | 5 |
我无法让它工作,稍后我会尝试 post 代码。
有没有更干净、更快速的方法? 感谢您的帮助!
使用melt
获取long格式为每个类别构造对应的日期格式:
df = pd.melt(df, id_vars='Date') # in each row: 2021-01-01 | A1 | 1
df['idx'] = df['variable'].str[:-1] # A, B, ...
df['Date'] = df['Date'].astype(str) + ' (' + df['variable'].str[-1] + ')'
df = df[['Date', 'idx', 'value']].pivot(values='value', index='idx', columns='Date')
如果您不想显示列,请设置df.index.name = None
:
Date 2021-01-01 (1) 2021-01-01 (2) 2021-01-01 (3) 2021-01-02 (1) 2021-01-02 (2) 2021-01-02 (3) 2021-01-03 (1) 2021-01-03 (2) 2021-01-03 (3) 2021-01-04 (1) 2021-01-04 (2) 2021-01-04 (3)
A 1 9 1 2 2 3 2 2 2 2 3 9
B 1 3 2 8 8 4 2 9 5 3 3 5