如何通过 DataFrame 将一组多列转换为一组标记值,同时又不想转换所有列

How to pivot a set of multiple columns into a set of flagged values through DataFrame while not wanting to pivot all columns

所以,我有一个高级的关键问题。考虑以下数据框

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

这给出了输出:

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

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()' 的所有组合,但它似乎不起作用。

想法?

提前致谢!

您可以将列 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