根据系列内容和数据框生成布尔数据框
Generating boolean dataframe based on contents in series and dataframe
我有:
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
和df
创建一个新的df,这样:
df_new = pd.DataFrame(index=unique, columns=df.columns) # size(5,3)
从这个新创建的 df,我想创建一个基于 unique
和 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
with DataFrame.reset_index
, DataFrame.pivot
, then check if not missing values by DataFrame.notna
, cast to integers for True->1
and False->0
mapping and last remove index and columns names by 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
Helper Series 不是必需的,但如果有更多值或需要更改 helper Series 的顺序,请使用添加 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
我有:
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
和df
创建一个新的df,这样:
df_new = pd.DataFrame(index=unique, columns=df.columns) # size(5,3)
从这个新创建的 df,我想创建一个基于 unique
和 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
with DataFrame.reset_index
, DataFrame.pivot
, then check if not missing values by DataFrame.notna
, cast to integers for True->1
and False->0
mapping and last remove index and columns names by 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
Helper Series 不是必需的,但如果有更多值或需要更改 helper Series 的顺序,请使用添加 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