Python Pandas pivot_table 透视后缺失列
我有一个数据框,这个数据框是通过读取一个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_level
和 total_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)
然后把你的 pivot
和 lookup
结合起来:
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")
注意,lsuffix
和 rsuffix
是必须的,用来区分列,因为两个 pivot 操作都有 0, 1, 2, 3, 4
和 10
这些列名,都是来自你的示例数据。