基于X列中较小值与较大值的长到宽格式拆分

2024-05-13 10:11:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有纵向数据的df(每个人两次观察),每个点的年龄和分数。目前,df为长格式:

subj = ['subj1', 'subj1', 'subj2', 'subj2', 'subj3', 'subj3']
age = [37, 40, 56, 41, 27, 29]
score = [2,1,2,5,3,5]

pd.DataFrame(list(zip(subj, age, score)),
               columns =['subj', 'age', 'score'])

我想将df转换为宽格式,其中每个主题由一行表示,第1列是年轻时的分数,第2列是老年时的分数

^{tb1}$

任何帮助都将不胜感激


Tags: 数据dataframedfage格式zip分数list
3条回答

您还可以使用agg对值和groupby进行排序:

d = {'first':'score_time1','last':'score_time2'}
out = (df.sort_values(['subj','age']).groupby('subj')['score'].agg(['first','last'])
                                                .rename(d,axis=1).reset_index())

print(out)


    subj  score_time1  score_time2
0  subj1            2            1
1  subj2            5            2
2  subj3            3            5

单向:

df1 = df.sort_values(['subj', 'age'])
df = pd.concat([df1.iloc[::2,[0,2]].set_index('subj'), df1.iloc[1::2,[0, 2]].set_index('subj')], 1)
df.columns = ['score_time1', 'core_time1']

通过pivot_tablerank的备选方案:

df = (
    df.pivot_table(
        index='subj',
        columns=df.groupby('subj')['age'].rank(method='dense').astype(int),
        values='score')
    .add_prefix('score_time_')
    .rename_axis(columns=None)
    .reset_index()
)

输出:

      score_time1  core_time1
subj                          
subj1            2           1
subj2            5           2
subj3            3           5

尝试使用^{}+^{}创建指示符seq,然后使用seq作为列和^{}创建^{},并清理索引和轴:

df['seq'] = df['age'].sort_values().groupby(df['subj']).cumcount() + 1
new_df = (
    df.pivot(index='subj', columns='seq', values='score')
        .add_prefix('score_time')
        .reset_index()
        .rename_axis(columns=None)
)

或者通过^{}在不影响^{的情况下动态使用series:

new_df = (
    df.pivot_table(index='subj',
                   columns=df['age'].sort_values().groupby(df['subj']).cumcount() + 1,
                   values='score')
        .add_prefix('score_time')
        .reset_index()
        .rename_axis(columns=None)
)

new_df

    subj  score_time1  score_time2
0  subj1            2            1
1  subj2            5            2
2  subj3            3            5

相关问题 更多 >