首页 > 解决方案 > 根据特定列中的值在 pandas 数据框中创建列

问题描述

我有以下熊猫数据框:

姓名 主题
数学
物理
阿尔巴 物理
阿尔巴 生物学
阿尔巴 化学
乔治 语言学

我想将其转换为以下内容:

姓名 主题1 主题2 主题3
数学 物理 -
阿尔巴 物理 生物学 化学
乔治 语言学 - -

标签: pythonpandas

解决方案


我们可以将 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']
})

推荐阅读