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

2024-09-29 02:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

正如标题所述,我想透视我的数据帧(我相信它需要透视?)

假设我有一个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  |
+----+-----+------+------+-------+

现在,组列中的值变为自己的列。每个列的值是基于原始df是否有该组的T/F

有什么建议吗?这似乎是一个支点,但我是一个大noob当涉及到与支点的工作


Tags: 数据idfalsetrue标题dataframedfgroup
3条回答

您可以创建一个与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

尝试使用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

相关问题 更多 >