Python Pandas pivot_table 透视后缺失列

6 投票
1 回答
8014 浏览
提问于 2025-04-28 04:22

我有一个数据框,这个数据框是通过读取一个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列。那么问题是,我该如何得到我在“期望结果”中展示的包含expert_level的数据框呢?

暂无标签

1 个回答

3

当你进行“反堆叠”操作时,其实你只是在处理一系列的 contrib_count,而 expert_leveltotal_min_length 在那个时候已经不在了。

与其设置索引再进行反堆叠,不如直接使用 .pivot() 方法。

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 是必须的,用来区分列,因为两个 pivot 操作都有 0, 1, 2, 3, 410 这些列名,都是来自你的示例数据。

撰写回答