正如标题所说,我想调整我的数据帧(我认为它需要调整?(
假设我有一个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
,然后使用groupby
和any
:
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
如果希望ID
和REV
列作为列而不是索引,则可以添加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