【问题标题】:How to use agg_func = 'All' in Python Pivot_table如何在 Python Pivot_table 中使用 agg_func = 'All'
【发布时间】:2019-12-04 13:48:23
【问题描述】:

我有一个如下所示的输入数据框

df = pd.DataFrame({'person_id' :[1,1,1,2,2,2,2,2,2],'level_1': ['L1FR','L1Date','L1value','L1FR','L1Date','L1value','L2FR','L2Date','L2value'], 'val3':['Fasting','11/4/2005',1.33,'Random','18/1/2007',4.63,'Fasting','18/1/2017',8.63]})

如下图所示

我想将我的输出转换为如下所示

这是我根据 SO 论坛的回复尝试的方法

g = df.level_1.str[-2:]
df.pivot_table(index='person_id', columns=g, values='val3',aggfunc='first')

这仅提供每个组(或人)的第一条记录,如下所示,非常接近我的预期输出。基本上我正在尝试进行某种转换/重新排列输入数据的显示方式

但我想拥有所有记录。在真实数据中,我有超过 10 万条记录,每个人都可以重复多次。

当我使用g.groupby(g).cumcount() 作为索引时,我得到了一半记录的 NA,我想避免它。我不知道为什么会出现这个问题。

解决此问题的任何其他方法也很有帮助。你能帮我得到这个输出吗?

【问题讨论】:

    标签: python python-3.x pandas dataframe pivot-table


    【解决方案1】:

    你已经很接近想要的东西了。

    这里的诀窍是像这样将另一个索引添加到您的第二级:

    df = pd.DataFrame({'person_id' :[1,1,1,2,2,2,2,2,2],'level_1': ['L1FR','L1Date','L1value','L1FR','L1Date','L1value','L2FR','L2Date','L2value'], 'val3':['Fasting','11/4/2005',1.33,'Random','18/1/2007',4.63,'Fasting','18/1/2017',8.63]})
    g = df.level_1.str[-2:]
    # Extracting level's number
    df['lvl'] = df.level_1.apply(lambda x: int(''.join(filter(str.isdigit, x))))
    # Then you pivot with person_id and lvl
    df = df.pivot_table(index=['person_id', 'lvl'], columns=g, values='val3', aggfunc='first')
    

    输出应该是:

                level_1     FR          te          ue
    person_id   lvl             
            1   1       Fasting     11/4/2005   1.33
            2   1           Random      18/1/2007   4.63
                2           Fasting     18/1/2017   8.63
    

    如果你像这样重置 1 级索引:

    df.reset_index(level=1).drop("lvl", axis=1)

    输出是:

    level_1     FR          te          ue
    person_id           
    1           Fasting     11/4/2005   1.33
    2           Random      18/1/2007   4.63
    2           Fasting     18/1/2017   8.63
    

    你去吧!

    【讨论】:

    • 实际上级别可能会像 L1、L2、L3、...L150 一样上升 150。在这种情况下,df.level_1.str[0:n] 选项是否也有助于为其他人创建统一级别?
    • 我的意思是 person_id = 1 可以有 1 个级别,而 person_id = 2 可以有 2 个级别,而 person_id = 10 可以有 15 个级别
    • 哦,我明白了!然后您应该考虑从 level_1 列中提取数字,然后在 lvlcolumn 中分配值。更新我的答案
    • 只是分享所有列的最后几个字符保持不变的信息。我的意思是 L1FR、L2FR、L3FR、L1Date、L2DATE、l3DATE、L1Value、L2Value、L3Value...如果这对解决方案有帮助的话,最后 2-3 个字符是相同的
    • 尝试你的答案
    猜你喜欢
    • 2018-09-03
    • 2018-07-29
    • 2023-04-08
    • 2012-05-08
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2020-10-08
    • 2019-02-13
    相关资源
    最近更新 更多