在pandas中将数据从单个列转换为多个列

3
我正在处理一个包含以下结构的数据库:
ID 测试 结果
12a 测试1 正常
12a 测试3 678.2
3s5 测试2 <1
3s5 测试1 正常
8r5 测试4 矩形(3+)
如您所见,不同的测试有不同的结果格式,并且并非每个ID都具有所有测试。
我想将其转换为以下内容:
ID 测试1 测试2 测试3 测试4
12a 正常 NA 678.2 NA
3s5 正常 <1 NA NA
8r5 NA NA NA 矩形(3+)
我尝试使用pandas.pivot进行操作,但遇到了以下错误。
df.pivot(index="ID",columns="Test",values="Result")

ValueError: Index contains duplicate entries, cannot reshape

将索引更改为ID不起作用,重置索引也不起作用。

任何帮助都将不胜感激!


1
这个回答解决了你的问题吗?如何对数据框进行透视? 或者 https://dev59.com/6FYN5IYBdhLWcg3w_80w - Chris
2个回答

2
你可以尝试使用.pivot_table()代替.pivot(),如下所示:
df.pivot_table(index="ID", columns="Test", values="Result", aggfunc='first')

Result:

Test   Test1 Test2  Test3            Test4
ID                                        
12a   Normal   NaN  678.2              NaN
3s5   Normal    <1    NaN              NaN
8r5      NaN   NaN    NaN  Rectangular(3+)

谢谢!我之前尝试使用pivot_table,但是漏掉了aggfunc="first"参数。现在运行得非常好! - Mario_B
2
@Mario_B 如果没有指定 aggfunc="first" 参数,那么默认的聚合函数是 aggfunc='mean',它需要数值类型的数据才能正常工作。由于你的数据包含非数值类型的数据,因此使用 aggfunc="first" 是一种让 pivot_table() 在这种数据上正常工作的技巧。 - SeaBean

1
这是一种方法:

这里是执行它的方式:

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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接