Pandas - 地图 - 虚拟变量 - 赋值为 1
Pandas - Map - Dummy Variables - Assign value of 1
我有两个数据框,x.head()
看起来像这样:
top mid adc support jungle
Irelia Ahri Jinx Janna RekSai
Gnar Ahri Caitlyn Leona Rengar
Renekton Fizz Sivir Annie Rengar
Irelia Leblanc Sivir Thresh JarvanIV
Gnar Lissandra Tristana Janna JarvanIV
我创建的数据框 fullmatrix.head()
如下所示:
Irelia Gnar Renekton Kassadin Sion Jax Lulu Maokai Rumble Lissandra ... XinZhao Amumu Udyr Ivern Shaco Skarner FiddleSticks Aatrox Volibear MonkeyKing
0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 ...
现在我想不通的是如何将 x 数据框中的每个名称的值 1 逐行分配给 fullmatrix
数据框中具有相同名称的相应列(两个数据框都有行数相同)。
OP 试图用一组数据点创建一个 table 虚拟变量。对于每个数据点,它包含 5 个属性。总共有 N
个独特的属性。
我们将使用一个简化的数据集来演示如何操作:
- 5 个独特属性
- 3 条数据
每个数据条目包含 3 个属性。
x = pd.DataFrame([['a', 'b', 'c'],
['b', 'd', 'e'],
['e', 'b', 'a']])
fullmatrix = pd.DataFrame([[0 for _ in range(5)] for _ in range(3)],
columns=['a','b','c','d','e'])
""" fullmatrix:
a b c d e
0 0 0 0 0 0
1 0 0 0 0 0
2 0 0 0 0 0
"""
# each row in x_temp is a string of attributed delimited by ","
x_row_joined = pd.Series((",".join(row[1]) for row in x.iterrows()))
fullmatrix = x_row_joined.str.get_dummies(sep=',')
该方法的灵感来自offbyone's answer It uses pandas.Series.str.get_dummies。我们首先用指定的分隔符连接 x 的每一行。然后使用 Series.str.get_dummies
方法。该方法采用我们仅用于连接属性的定界符,并将为您生成虚拟变量 table。 (注意:不要选择 x 中存在的 sep
。)
考虑添加一个 key = 1
列,然后遍历每一列以获得旋转 dfs 列表,然后将其与 pd.concat
. Finally run a DataFrame.update()
水平合并以更新原始 fullmatrix 的值来自 pvt_df,与索引对齐。
x['key'] = 1
dfs = []
for col in x.columns[:-1]:
dfs.append(x.pivot_table(index=df.index, columns=[col], values='key').fillna(0))
pvt_df = pd.concat(dfs, axis=1).astype(int)
fullmatrix.update(pvt_df)
fullmatrix = fullmatrix.astype(int)
fullmatrix # ONLY FOR VISIBLE COLUMNS IN ORIGINAL POST
# Irelia Gnar Renekton Kassadin Sion Jax Lulu Maokai Rumble Lissandra XinZhao Amumu Udyr Ivern Shaco Skarner FiddleSticks Aatrox Volibear MonkeyKing
# 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
我确信这可以改进,但一个优点是它只需要第一个 DataFrame,并且在您获得所需的解决方案之前链式操作在概念上很好。
fullmatrix = (x.stack()
.reset_index(name='names')
.pivot(index='level_0', columns='names', values='names')
.applymap(lambda x: int(x!=None))
.reset_index(drop=True))
请注意,只有出现在您的 x
DataFrame 中的名称才会显示为 fullmatrix
中的列。如果你想要额外的列,你可以简单地执行一个连接。
我有两个数据框,x.head()
看起来像这样:
top mid adc support jungle
Irelia Ahri Jinx Janna RekSai
Gnar Ahri Caitlyn Leona Rengar
Renekton Fizz Sivir Annie Rengar
Irelia Leblanc Sivir Thresh JarvanIV
Gnar Lissandra Tristana Janna JarvanIV
我创建的数据框 fullmatrix.head()
如下所示:
Irelia Gnar Renekton Kassadin Sion Jax Lulu Maokai Rumble Lissandra ... XinZhao Amumu Udyr Ivern Shaco Skarner FiddleSticks Aatrox Volibear MonkeyKing
0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 ...
现在我想不通的是如何将 x 数据框中的每个名称的值 1 逐行分配给 fullmatrix
数据框中具有相同名称的相应列(两个数据框都有行数相同)。
OP 试图用一组数据点创建一个 table 虚拟变量。对于每个数据点,它包含 5 个属性。总共有 N
个独特的属性。
我们将使用一个简化的数据集来演示如何操作:
- 5 个独特属性
- 3 条数据
每个数据条目包含 3 个属性。
x = pd.DataFrame([['a', 'b', 'c'], ['b', 'd', 'e'], ['e', 'b', 'a']]) fullmatrix = pd.DataFrame([[0 for _ in range(5)] for _ in range(3)], columns=['a','b','c','d','e']) """ fullmatrix: a b c d e 0 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 """ # each row in x_temp is a string of attributed delimited by "," x_row_joined = pd.Series((",".join(row[1]) for row in x.iterrows())) fullmatrix = x_row_joined.str.get_dummies(sep=',')
该方法的灵感来自offbyone's answer It uses pandas.Series.str.get_dummies。我们首先用指定的分隔符连接 x 的每一行。然后使用 Series.str.get_dummies
方法。该方法采用我们仅用于连接属性的定界符,并将为您生成虚拟变量 table。 (注意:不要选择 x 中存在的 sep
。)
考虑添加一个 key = 1
列,然后遍历每一列以获得旋转 dfs 列表,然后将其与 pd.concat
. Finally run a DataFrame.update()
水平合并以更新原始 fullmatrix 的值来自 pvt_df,与索引对齐。
x['key'] = 1
dfs = []
for col in x.columns[:-1]:
dfs.append(x.pivot_table(index=df.index, columns=[col], values='key').fillna(0))
pvt_df = pd.concat(dfs, axis=1).astype(int)
fullmatrix.update(pvt_df)
fullmatrix = fullmatrix.astype(int)
fullmatrix # ONLY FOR VISIBLE COLUMNS IN ORIGINAL POST
# Irelia Gnar Renekton Kassadin Sion Jax Lulu Maokai Rumble Lissandra XinZhao Amumu Udyr Ivern Shaco Skarner FiddleSticks Aatrox Volibear MonkeyKing
# 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
我确信这可以改进,但一个优点是它只需要第一个 DataFrame,并且在您获得所需的解决方案之前链式操作在概念上很好。
fullmatrix = (x.stack()
.reset_index(name='names')
.pivot(index='level_0', columns='names', values='names')
.applymap(lambda x: int(x!=None))
.reset_index(drop=True))
请注意,只有出现在您的 x
DataFrame 中的名称才会显示为 fullmatrix
中的列。如果你想要额外的列,你可以简单地执行一个连接。