Pandas透视数据帧,并根据新列是否存在将其设置为True/False



正如标题所说,我想调整我的数据帧(我认为它需要调整?(

假设我有一个df,看起来像这样:

df = pd.DataFrame({'ID' : [0, 0, 1, 1, 1], 
                   'REV' : [0, 0, 1, 1, 1],
                   'GROUP' : [1, 2, 1, 2, 3]})

+----+-----+-------+
| ID | REV | GROUP |
+----+-----+-------+
|  0 |   0 |     1 |
|  0 |   0 |     2 |
|  1 |   1 |     1 |
|  1 |   1 |     2 |
|  1 |   1 |     3 |
+----+-----+-------+

我想做一些枢轴,这样我的表格结果看起来像

+----+-----+------+------+-------+
| ID | REV |  1   |  2   |   3   |
+----+-----+------+------+-------+
|  0 |   0 | True | True | False |
|  1 |   1 | True | True | True  |
+----+-----+------+------+-------+

现在,GROUP列中的值变成了自己的列。这些列中的每一列的值都是T/F,这取决于原始df是否具有该组。

有什么建议吗?这看起来像是一个枢轴的事情,但当涉及到使用枢轴时,我是一个大傻瓜

试用crosstab

out = pd.crosstab([df.ID,df.REV],df.GROUP).ne(0).reset_index().rename_axis(None,axis=1)
out
   ID  REV     1     2      3
0   0    0  True  True  False
1   1    1  True  True   True

我会使用get_dummies,然后使用groupbyany:

pd.get_dummies(df.set_index(["ID", "REV"]).GROUP).groupby(level=[0,1]).any()

           1     2      3
ID REV                   
0  0    True  True  False
1  1    True  True   True

如果希望IDREV列作为列而不是索引,则可以添加reset_index

pd.get_dummies(df.set_index(["ID", "REV"]).GROUP).groupby(level=[0,1]).any().reset_index()
   ID  REV     1     2      3
0   0    0  True  True  False
1   1    1  True  True   True

您可以创建一个与GROUP相同的伪列,然后将该伪列用作pivot_table()中的值。

df['GROUP_'] = df['GROUP']
df_ = ~ pd.pivot_table(df, index=['ID', 'REV'], columns='GROUP', values='GROUP_').isna()
print(df_)
GROUP      1     2      3
ID REV                   
0  0    True  True  False
1  1    True  True   True
print(df_.reset_index().rename_axis(None,axis=1))
   ID  REV     1     2      3
0   0    0  True  True  False
1   1    1  True  True   True

最新更新