add*_*ons 6 python pivot-table dataframe pandas
我有以下数据框。数据框是通过读取 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
Run Code Online (Sandbox Code Playgroud)
预期结果 枢轴后我想要的是以下数据框:
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
Run Code Online (Sandbox Code Playgroud)
我这样做的原因是一旦我这样做了,我就可以将其用作预测任务,作为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()
Run Code Online (Sandbox Code Playgroud)
通过这样做我得到:
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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我错过了expert_level最后的专栏。所以问题是如何使用 Expert_level 获得上述数据框,如我的“预期结果”中所示?
当你取消堆叠时,你只是取消堆叠一个系列contrib_count-expert_level并且total_min_length那时已经消失了。
您可以使用而不是设置索引和取消堆叠.pivot()
pivoted = df.pivot('user_id', 'group_space', 'contrib_count')
Run Code Online (Sandbox Code Playgroud)
然后,创建一个框架user_id作为索引和expert_level列,消除重复项:
lookup = df.drop_duplicates('user_id')[['user_id', 'expert_level']]
lookup.set_index(['user_id'], inplace=True)
Run Code Online (Sandbox Code Playgroud)
然后加入你的pivot和lookup
result = pivoted.join(lookup)
Run Code Online (Sandbox Code Playgroud)
编辑:如果您还想包含total_min_length,您可以进行第二个枢轴:
pivoted2 = df.pivot('user_id', 'group_space', 'total_min_length')
Run Code Online (Sandbox Code Playgroud)
并加入所有三个而不是两个:
result = pivoted.join(lookup).join(pivoted2, lsuffix="_contrib_count", rsuffix="_total_min_length")
Run Code Online (Sandbox Code Playgroud)
请注意,需要使用lsuffix和来消除列的歧义,因为两个数据透视表都具有示例数据中的和列。rsuffix0, 1, 2, 3, 410