我有一个像这样的数据集:
ID Type Value
01 A $10
01 B $12
01 C $14
02 B $20
02 C $21
03 B $11
我想将其转换为:
ID TypeA TypeB TypeC
01 $10 $12 $14
02 $0 $20 $21
03 $0 $11 $0
我唯一的解决方案是一堆if循环,但是没有几层。谁能帮我解决这个python(pandas)问题?
谢谢
答案 0 :(得分:1)
将前两列转换为多索引(两级索引)。拆开数据框(将第二级行索引转换为列索引)。用"$"
填补空白:
d = df.set_index(['ID', 'Type']).unstack().fillna('$0')
更新列名:
d.columns = 'Type' + d.columns.levels[1]
结果:
Type TypeA TypeB TypeC
ID
01 $10 $12 $14
02 $0 $20 $21
03 $0 $11 $0
如果索引名称'Type'
困扰您,请将其禁用:
d.columns.name = None
最后,如果您希望ID为列而不是索引,请重置索引:
d.reset_index(inplace=True)
最终结果:
ID TypeA TypeB TypeC
0 01 $10 $12 $14
1 02 $0 $20 $21
2 03 $0 $11 $0
答案 1 :(得分:1)
您可以使用熊猫
尝试一下,
import pandas as pd
我为您的样本数据创建了一个数据文件psort.txt。
ID,Type,Value
01,A,$10
01,B,$12
01,C,$14
02,B,$20
02,C,$21
03,B,$11
并导入
df = pd.read_csv('psort.txt', header=0)
ID Type Value
0 1 A $10
1 1 B $12
2 1 C $14
3 2 B $20
4 2 C $21
5 3 B $11
然后我旋转数据框,
df=df.pivot(index='ID',columns='Type', values='Value')
下面,我用0填充NaN值,但是我可以用'$ 0'填充。
df=df.fillna(0)
print(df)
Type A B C
ID
1 $10 $12 $14
2 0 $20 $21
3 0 $11 0