pandas - 根据系列内容和数据框生成布尔数据框
问题描述
我有:
df = pd.DataFrame(
[
[22, 33, 44],
[55, 11, 22],
[33, 55, 11],
],
index=["abc", "def", "ghi"],
columns=list("abc")
) # size(3,3)
和:
unique = pd.Series([11, 22, 33, 44, 55]) # size(1,5)
然后我基于unique
and创建一个新的 df df
,这样:
df_new = pd.DataFrame(index=unique, columns=df.columns) # size(5,3)
从这个新创建的 df 中,我想创建一个基于unique
and的新布尔 df df
,因此最终结果是:
df_new = pd.DataFrame(
[
[0, 1, 1],
[1, 0, 1],
[1, 1, 0],
[0, 0, 1],
[1, 1, 0],
],
index=unique,
columns=df.columns
)
这个新的 df 是真还是假,具体取决于该值是否存在于原始数据帧中。例如,第一列有三个值:[22,55,33]。在尺寸为 (5,3) 的 df 中,第一列将是: [0, 1, 1, 0, 1] 即 [0, 22, 33, 0 , 55]
我试过filter2 = unique.isin(df)
了,但这不起作用,也不为空。我尝试应用过滤器,但返回的尺寸不正确。我怎样才能做到这一点?
解决方案
DataFrame.stack
与DataFrame.reset_index
,一起使用DataFrame.pivot
,然后通过 来检查是否没有缺失值,为和映射DataFrame.notna
转换为整数,最后通过以下方式删除索引和列名:True->1
False->0
DataFrame.rename_axis
df_new = (df.stack()
.reset_index(name='v')
.pivot('v','level_1','level_0')
.notna()
.astype(int)
.rename_axis(index=None, columns=None))
print (df_new)
a b c
11 0 1 1
22 1 0 1
33 1 1 0
44 0 0 1
55 1 1 0
辅助系列不是必需的,但如果有更多值或需要通过辅助系列更改订单,请使用添加DataFrame.reindex
:
#added 66
unique = pd.Series([11, 22, 33, 44, 55,66])
df_new = (df.stack()
.reset_index(name='v')
.pivot('v','level_1','level_0')
.reindex(unique)
.notna()
.astype(int)
.rename_axis(index=None, columns=None))
print (df_new)
a b c
11 0 1 1
22 1 0 1
33 1 1 0
44 0 0 1
55 1 1 0
66 0 0 0
推荐阅读
- amazon-s3 - 自动更新程序不适用于 Amazon S3 私有存储桶
- flutter - 在 CupertinoPicker 和 CupertinoDatePicker 中选择 Value onTap
- python-3.x - 在 jupyter 终端中退出 powershell
- angular - Angular 6 - 安装 ng-recaptcha 给出错误 TS1005: ';' 预期的
- r - 当我将一个矩阵分配给另一个矩阵时,R 会话被中止
- swiftui - 带有 NavigationView/NavigationLink 延迟的程序化导航跳回
- javascript - 是否可以在组件之外使用 route.meta 属性?
- mysql - 使用 MySQL 测试数据库的 Github 操作
- algorithm - 此 Word Break DFS + 记忆解决方案的时间复杂度
- python - 如何在python中用正斜杠替换方括号中的数字