【问题标题】:How to pivot a set of multiple columns into a set of flagged values through DataFrame while not wanting to pivot all columns如何通过DataFrame将一组多列旋转为一组标记值,同时又不想旋转所有列
【发布时间】:2017-10-26 14:29:56
【问题描述】:

所以,我有一个高级支点问题。考虑以下数据框

dfa = pandas.DataFrame([["g1","15","Annie","Bard"], ["g2","18","Lux","Annie"], ["g3","15","Olaf","Twitch"]], columns=["gameId", "duration", "Champ1", "Champ2"])

这给出了输出:

通过应用以下堆栈溢出问题 how to pivot complex dataframe 中的逻辑,我得到

pandas.melt(dfa, id_vars=['gameId']) \
    .set_index('gameId')['value'] \
    .str.get_dummies() \
    .groupby(level=0) \
    .agg(np.sum)

但是,我不想旋转持续时间列,因此我更改了代码并添加了“value_vars”

pandas.melt(dfa, id_vars=['gameId'], value_vars = ['Champ1','Champ2']) \
    .set_index('gameId')['value'] \
    .str.get_dummies() \
    .groupby(level=0) \
    .agg(np.sum)

现在我丢失了持续时间列。此列不是索引,因为它不是唯一的,但我不想旋转它。我已经尝试了将它添加到 'id_vars' 或 'set_index()' 的所有组合,但它似乎不起作用。

想法?

提前致谢!

【问题讨论】:

    标签: pandas dataframe pivot melt


    【解决方案1】:

    您可以将列 duration 添加到 id_vars,然后添加到 set_index 和最后一个 groupby Multiindex 中的两个级别,如下所示:

    a = pd.melt(dfa, id_vars=['gameId', 'duration']) \
        .set_index(['gameId', 'duration'])['value'] \
        .str.get_dummies()
        .sum(level=[0,1])
    print (a)
                     Annie  Bard  Lux  Olaf  Twitch
    gameId duration                                
    g1     15            1     1    0     0       0
    g2     18            1     0    1     0       0
    g3     15            0     0    0     1       1
    

    什么是相同的:

    a = pd.melt(dfa, id_vars=['gameId', 'duration']) \
        .set_index(['gameId', 'duration'])['value'] \
        .str.get_dummies() \
        .groupby(level=[0,1]) \
        .sum()
    print (a)
                     Annie  Bard  Lux  Olaf  Twitch
    gameId duration                                
    g1     15            1     1    0     0       0
    g2     18            1     0    1     0       0
    g3     15            0     0    0     1       1
    

    【讨论】:

    • 谢谢,这是完美的。我尝试了“gameId”、“duration”,但没有在列表中,也没有在 group by 中的级别。
    • 不客气。顺便说一句,如果需要总是01 输出需要max,而不是sum
    • 那么,我将如何按时长 = 15 进行查询?我可以使用 a.loc[:'g1'] 通过 gameId = g1 进行查询,但是 a.loc[:15] 或 a.loc[:'15'] 似乎不起作用。
    • 试试a.xs(15, level=1)
    • 然后检查一下 - xs
    猜你喜欢
    • 2022-01-21
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2016-07-18
    相关资源
    最近更新 更多