Python pandas dataframe reshape long to wide,多列和常量值
Python pandas dataframe reshape long to wide, multiple columns and constant values
我需要将 DataFrame 从长格式重塑为宽格式。数据示例:
import pandas as pd
df = pd.DataFrame({'id':[1,1,1,2,2,2,3,3], 'id_age':
30,30,30,23,23,23,29,29], 'product':['A','B','C','A','B','C','A','B'],
'rank':[1,2,3,3,1,2,2,1], 'result':['x','y','z','p','q','r','s','t']})
print(df)
id id_age product rank result
0 1 30 A 1 x
1 1 30 B 2 y
2 1 30 C 3 z
3 2 23 A 3 p
4 2 23 B 1 q
5 2 23 C 2 r
6 3 29 A 2 s
7 3 29 B 1 t
期望的输出是
id id_age product rank result
0 1 30 [A, B, C] [1, 2, 3] [x, y, z]
1 2 23 [A, B, C] [3, 1, 2] [p, q, r]
2 3 29 [A, B] [2, 1] [s, t]
即每个 ID 一行。我试图通过创建一个枢轴 table 来解决问题,但我不知道如何:
- 为不止一列(产品、排名、结果)重塑它
- 处理个体内部不变的值 (id_age)
- 将最终数据框中的列设为列表格式(并且顺序很重要,rank 中列表的第一个值对应于给定个体结果中列表的第一个值)。
如有任何关于如何推进此问题的建议,我们将不胜感激!
对于我来说工作:
df = df.groupby(['id','id_age']).agg(tuple).applymap(list)
print (df)
product rank result
id id_age
1 30 [A, B, C] [1, 2, 3] [x, y, z]
2 23 [A, B, C] [3, 1, 2] [p, q, r]
3 29 [A, B] [2, 1] [s, t]
我以前也不知道怎么做...
df1=df.groupby(['id','id_age'])['product','rank','result'].apply(lambda x : x.T.values.tolist()).apply(pd.Series)
df1.columns=['product','rank','result']
df1
Out[126]:
product rank result
id id_age
1 30 [A, B, C] [1, 2, 3] [x, y, z]
2 23 [A, B, C] [3, 1, 2] [p, q, r]
3 29 [A, B] [2, 1] [s, t]
我需要将 DataFrame 从长格式重塑为宽格式。数据示例:
import pandas as pd
df = pd.DataFrame({'id':[1,1,1,2,2,2,3,3], 'id_age':
30,30,30,23,23,23,29,29], 'product':['A','B','C','A','B','C','A','B'],
'rank':[1,2,3,3,1,2,2,1], 'result':['x','y','z','p','q','r','s','t']})
print(df)
id id_age product rank result
0 1 30 A 1 x
1 1 30 B 2 y
2 1 30 C 3 z
3 2 23 A 3 p
4 2 23 B 1 q
5 2 23 C 2 r
6 3 29 A 2 s
7 3 29 B 1 t
期望的输出是
id id_age product rank result
0 1 30 [A, B, C] [1, 2, 3] [x, y, z]
1 2 23 [A, B, C] [3, 1, 2] [p, q, r]
2 3 29 [A, B] [2, 1] [s, t]
即每个 ID 一行。我试图通过创建一个枢轴 table 来解决问题,但我不知道如何:
- 为不止一列(产品、排名、结果)重塑它
- 处理个体内部不变的值 (id_age)
- 将最终数据框中的列设为列表格式(并且顺序很重要,rank 中列表的第一个值对应于给定个体结果中列表的第一个值)。
如有任何关于如何推进此问题的建议,我们将不胜感激!
对于我来说工作:
df = df.groupby(['id','id_age']).agg(tuple).applymap(list)
print (df)
product rank result
id id_age
1 30 [A, B, C] [1, 2, 3] [x, y, z]
2 23 [A, B, C] [3, 1, 2] [p, q, r]
3 29 [A, B] [2, 1] [s, t]
我以前也不知道怎么做...
df1=df.groupby(['id','id_age'])['product','rank','result'].apply(lambda x : x.T.values.tolist()).apply(pd.Series)
df1.columns=['product','rank','result']
df1
Out[126]:
product rank result
id id_age
1 30 [A, B, C] [1, 2, 3] [x, y, z]
2 23 [A, B, C] [3, 1, 2] [p, q, r]
3 29 [A, B] [2, 1] [s, t]