将数据从单列转换为 pandas 中的多列
Transforming the data from a single column into multiple columns in pandas
我正在使用包含以下结构的数据库
ID
Test
Result
12a
Test1
Normal
12a
Test3
678.2
3s5
Test2
<1
3s5
Test1
Normal
8r5
Test4
Rectangular(3+)
如您所见,不同的测试有不同的结果格式,并不是每个ID都有所有的测试。
我想将其转换成如下内容:
ID
Test1
Test2
Test3
Test4
12a
Normal
NA
678.2
NA
3s5
Normal
<1
NA
NA
8r5
NA
NA
NA
Rectangular(3+)
我试过 pandas.pivot
但遇到了以下错误
df.pivot(index="ID",columns="Test",values="Result")
ValueError: Index contains duplicate entries, cannot reshape
将索引更改为 ID 无效,也无法重置索引。
任何帮助将不胜感激!
这是一种方法:
df = {'ID': ['12a', '12a', '3s5', '3s5', '8r5'],
'Test': ['Test1', 'Test3', 'Test2', 'Test1', 'Test4'],
'Result': ['Normal', '678.2', '<1', 'Normal', 'Rectangular(3+)']}
df=df.groupby(['ID', 'Test'])['Result'].sum().unstack(fill_value="NA")
您可以尝试使用.pivot_table()
代替.pivot()
,如下:
df.pivot_table(index="ID", columns="Test", values="Result", aggfunc='first')
结果:
Test Test1 Test2 Test3 Test4
ID
12a Normal NaN 678.2 NaN
3s5 Normal <1 NaN NaN
8r5 NaN NaN NaN Rectangular(3+)
我正在使用包含以下结构的数据库
ID | Test | Result |
---|---|---|
12a | Test1 | Normal |
12a | Test3 | 678.2 |
3s5 | Test2 | <1 |
3s5 | Test1 | Normal |
8r5 | Test4 | Rectangular(3+) |
如您所见,不同的测试有不同的结果格式,并不是每个ID都有所有的测试。
我想将其转换成如下内容:
ID | Test1 | Test2 | Test3 | Test4 |
---|---|---|---|---|
12a | Normal | NA | 678.2 | NA |
3s5 | Normal | <1 | NA | NA |
8r5 | NA | NA | NA | Rectangular(3+) |
我试过 pandas.pivot
但遇到了以下错误
df.pivot(index="ID",columns="Test",values="Result")
ValueError: Index contains duplicate entries, cannot reshape
将索引更改为 ID 无效,也无法重置索引。
任何帮助将不胜感激!
这是一种方法:
df = {'ID': ['12a', '12a', '3s5', '3s5', '8r5'],
'Test': ['Test1', 'Test3', 'Test2', 'Test1', 'Test4'],
'Result': ['Normal', '678.2', '<1', 'Normal', 'Rectangular(3+)']}
df=df.groupby(['ID', 'Test'])['Result'].sum().unstack(fill_value="NA")
您可以尝试使用.pivot_table()
代替.pivot()
,如下:
df.pivot_table(index="ID", columns="Test", values="Result", aggfunc='first')
结果:
Test Test1 Test2 Test3 Test4
ID
12a Normal NaN 678.2 NaN
3s5 Normal <1 NaN NaN
8r5 NaN NaN NaN Rectangular(3+)