python - 如何将值列表转换为熊猫列?
问题描述
我有一个如下所示的 df,我想将值转换为列(枢轴)操作。我无法执行,因为我的数据在列表中。
我的示例输入有两列(分数和类别)。这些列是有序值。即,第 19 课的分数是 0.97,第 0 课的分数是 0.77。我想转换我的 df 以便类值将是列名,并且相应的分数将在相应的列中。
样本输入:
file_name scores classes
0 voc_32.jpg [0.97, 0.77] [19.0, 0.0]
1 voc_22.jpg [0.92, 0.64, 0.83, 0.55] [17.0, 1.0, 11.0, 11.0]
预期输出:
file_name 0 1 11 17 19
0 voc_32.jpg 0.77 0.97
1 voc_22.jpg 0.64 [0.83, 0.55] 0.92
任何帮助都是不言而喻的。
解决方案
在列表理解中创建字典列表并传递给DataFrame
构造函数,最后添加到原始 by DataFrame.join
:
df1 = (pd.DataFrame([dict(zip(b, a)) for a, b in zip(df.scores, df.classes)],
index=df.index).sort_index(axis=1).rename(columns=int))
df2 = df[['file_name']].join(df1)
与删除列类似的解决方案DataFrame.pop
:
df1 = (pd.DataFrame([dict(zip(b, a)) for a, b in zip(df.pop('scores'), df.pop('classes'))],
index=df.index).sort_index(axis=1).rename(columns=int))
df2 = df.join(df1)
print (df2)
file_name 0 1 11 17 19
0 voc_32.jpg 0.77 NaN NaN NaN 0.97
1 voc_22.jpg NaN 0.64 0.83 0.92 NaN
编辑:对于列表,如果多个类Series.explode
用于 flattem,然后GroupBy.agg
通过 reshape聚合自定义函数Series.unstack
:
f = lambda x: list(x) if len(x) > 1 else x
df1 = (df.apply(pd.Series.explode)
.groupby(['file_name','classes'])['scores']
.agg(f)
.unstack()
.rename(columns=int))
print (df1)
classes 0 1 11 17 19
file_name
voc_22.jpg NaN 0.64 [0.83, 0.85] 0.92 NaN
voc_32.jpg 0.77 NaN NaN NaN 0.97
df2 = df[['file_name']].join(df1, on='file_name')
print (df2)
file_name 0 1 11 17 19
0 voc_32.jpg 0.77 NaN NaN NaN 0.97
1 voc_22.jpg NaN 0.64 [0.83, 0.85] 0.92 NaN
推荐阅读
- mongodb - MongoDB聚合合并和检索
- python - 通用代码中某些列的一阶差分
- c - 为什么没有类型转换警告?
- java - Youtube 播放器 API 访问被拒绝找到属性
- laravel - 令人困惑的 Laravel 路线
- rstudio - 在 RStudio 中自定义拼写检查突出显示颜色
- swift - 如何在拖放区域中接受目录?
- python - Python:遍历字符串列表并将它们与类对象相关联
- python - 如何将使用 tensorflow 构建的模型转换为 keras api?
- python - 如何配置 viewsets.ModelViewSet 以使用请求正文中传递的参数进行过滤。(Django 休息框架)