【问题标题】:Python Pandas pivot_table missing column after pivot透视后Python Pandas pivot_table缺少列
【发布时间】:2014-10-17 18:23:06
【问题描述】:

我有以下数据框。数据框是通过读取 csv 文件构建的。它是一个大型数据集,但出于这个问题的目的,我使用了数据集中的 15 行作为示例。

   user_id   contrib_count   total_min_length     group_space     expert_level
0     23720        108           1112696               0             l-2
1     23720         13            442059               1             l-2
2     23720         12             32180               2             l-2
3     23720          2             20177               3             l-2
4     23720          1              1608              10             l-2
5   1265184         71            260186               0             l-G
6   1265184         10              3466               2             l-G
7   1265184          1             12081               4             l-G
8    513380        112           1049311               0             l-4
9    513380          1                97               1             l-4
10   513380        113            361980               2             l-4
11   513380         19           1198323               3             l-4
12   513380          2             88301               4             l-4
13    20251        705          17372707               0             l-G
14    20251        103           2327178               1             l-G

预期结果 在枢轴之后,我想要的是以下数据框:

group_space        0      1     2     3     4     5    6   7    8   9    10  expert_level
user_id
20251             705    103    68    24    18     2    6 NaN  NaN   5   22     l-G                                                                  
23720             108     13    12     2   NaN   NaN  NaN NaN  NaN NaN    1     l-2

我这样做的原因是,一旦我这样做了,我就可以将它用于预测任务,其中expert_level 作为标签数据。

到目前为止,我已经完成了构建上述矩阵的操作,但我无法获得枢轴后所示的expert_level 列。

这就是我所做的:

class GroupAnalysis():

    def __init__(self):
        self.df = None
        self.filelocation = '~/somelocation/x.csv'

    def pivot_dataframe(self):

        raw_df = pd.read_csv(self.filelocation)
        self.df = raw_df[(raw_df['group_space'] < 11)]
        self.df.set_index(['user_id', 'group_space'], inplace=True)
        self.df = self.df['contrib_count'].unstack()

通过这样做,我得到:

group_space        0      1     2     3     4     5    6   7    8   9    10
user_id
20251             705    103    68    24    18     2    6 NaN  NaN   5   22                                                                
23720             108     13    12     2   NaN   NaN  NaN NaN  NaN NaN    1 

如您所见,我缺少末尾的 expert_level 列。所以问题是我如何才能获得专家级别的数据框,如我的“预期结果”中所示?

【问题讨论】:

    标签: python pandas dataframe pivot-table


    【解决方案1】:

    当您取消堆叠时,您只是在取消堆叠系列 contrib_count - expert_leveltotal_min_length 在那时已经消失了。

    您可以使用.pivot()而不是设置索引和unstacking

    pivoted = df.pivot('user_id', 'group_space', 'contrib_count')
    

    然后,创建一个以user_id 为索引、expert_level 为列的框架,去除重复项:

    lookup = df.drop_duplicates('user_id')[['user_id', 'expert_level']]
    lookup.set_index(['user_id'], inplace=True)
    

    然后加入您的pivotlookup

    result = pivoted.join(lookup)
    

    编辑: 如果你还想包含total_min_length,你可以做第二个pivot:

    pivoted2 = df.pivot('user_id', 'group_space', 'total_min_length')
    

    并加入所有三个而不是两个:

    result = pivoted.join(lookup).join(pivoted2, lsuffix="_contrib_count", rsuffix="_total_min_length")
    

    请注意,lsuffixrsuffix 是消除列歧义所必需的,因为这两个数据透视表都有来自示例数据的 0, 1, 2, 3, 410 列。

    【讨论】:

    • 我认为这行得通,是否可以包含total_min_length?所以我可以使用该功能。
    • 感谢您的精彩回答。小问题我收到值错误:ValueError: columns overlap but no suffix specified: Index([u'expert_level'], dtype='object')
    • @Null-Hypothesis 连接两个具有相同列名且未指定“lsuffix”和“rsuffix”参数的帧时会发生错误。违规列是“expert_level”,这意味着您可能两次错误地加入了“查找”框架。
    • 我对这个旋转表有一个小问题。您如何跨列求和,并将每个单元格除以该单元格所属的特定行的总和?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多