python - 根据特定列中的值在 pandas 数据框中创建列
问题描述
我有以下熊猫数据框:
姓名 | 主题 |
---|---|
乔 | 数学 |
乔 | 物理 |
阿尔巴 | 物理 |
阿尔巴 | 生物学 |
阿尔巴 | 化学 |
乔治 | 语言学 |
我想将其转换为以下内容:
姓名 | 主题1 | 主题2 | 主题3 |
---|---|---|---|
乔 | 数学 | 物理 | - |
阿尔巴 | 物理 | 生物学 | 化学 |
乔治 | 语言学 | - | - |
解决方案
我们可以将 aset_index
与 结合使用groupby cumcount
,然后折叠 MultiIndex:
new_df = df.set_index([
'Name',
df.groupby('Name').cumcount() + 1 # enumerate rows per name
]).unstack(
fill_value='-' # Fill Missing Values with '-'
)
# Collapse MultiIndex
new_df.columns = new_df.columns.map(lambda t: ''.join(map(str, t)))
# Restore Range Index
new_df = new_df.reset_index()
或pipe
作为链保持:
new_df = df.set_index([
'Name',
df.groupby('Name').cumcount() + 1 # enumerate rows per name
]).unstack(
fill_value='-' # Fill Missing Values with '-'
).pipe(lambda d: d.set_axis(
# Collapse MultiIndex
d.columns.map(lambda t: ''.join(map(str, t))),
axis=1
)).reset_index() # Restore Name Column
new_df
:
Name Subject1 Subject2 Subject3
0 Joe Maths Physics -
1 Alba Physics Biology Chemistry
2 George Linguistics - -
设置:
import pandas as pd
df = pd.DataFrame({
'Name': ['Joe', 'Joe', 'Alba', 'Alba', 'Alba', 'George'],
'Subject': ['Maths', 'Physics', 'Physics', 'Biology', 'Chemistry',
'Linguistics']
})
推荐阅读
- quicktype - quicktype json schema to typescript just-type in custom function
- kiwi-tcms - 遇到未捕获的 ReferenceError:未定义 renderFromCache
- c++ - c++ 程序无法从外部代码::blocks 正常运行
- java - 随机飞镖程序
- spring - 为什么在 Spring Security 中出现未知 [Error Creating bean with name 'delegatingApplicationListener']?重要的
- vue.js - v-model 在 Vue 2.x 中有哪些限制?
- ruby-on-rails - 在厨师中使用数组时,我遇到了问题
- python - 将数据保存到模型的问题。错误:禁止保存()以防止由于未保存的相关对象而导致数据丢失
- azure - 在域中使用 VisualStudio 2019 pro
- plotly.js - 在我的 html 网页中绘制的图表根本没有呈现