将一列中的数组值转换为原始 DataFrame 的列的最佳方法是什么?
What's the best way to transform Array values in one column to columns of the original DataFrame?
我有一个 table,其中一列是二进制特征数组,当该特征存在时它们就在那里。
我想在这些行上训练逻辑模型,但无法获得所需格式的数据,其中每个特征值都是它自己的列,具有 1 或 0 值。
示例:
id feature values
1 ['HasPaws', 'DoesBark', 'CanFetch']
2 ['HasPaws', 'CanClimb', 'DoesMeow']
我想把它变成
的格式
id HasPaws DoesBark CanFetch CanClimb DoesMeow
1 1 1 1 0 0
2 1 0 0 1 0
似乎内置了一些功能来实现这一点,但我想不出这种转换叫什么来做我自己更好的搜索。
您可以先将列表转换为列,然后使用get_dummies()方法:
In [12]: df
Out[12]:
id feature_values
0 1 [HasPaws, DoesBark, CanFetch]
1 2 [HasPaws, CanClimb, DoesMeow]
In [13]: (pd.get_dummies(df.set_index('id').feature_values.apply(pd.Series),
...: prefix='', prefix_sep='')
...: .reset_index()
...: )
Out[13]:
id HasPaws CanClimb DoesBark CanFetch DoesMeow
0 1 1 0 1 1 0
1 2 1 1 0 0 1
另一种选择是遍历 feature values
列,并从每个单元格构建一个系列,并将列表中的值作为索引。这样,pandas 会将系列扩展为 index
为 headers:
的数据框
pd.concat([df['id'],
(df['feature values'].apply(lambda lst: pd.Series([1]*len(lst), index=lst))
.fillna(0)], axis=1)
方法一
pd.concat([df['id'], df['feature values'].apply(pd.value_counts)], axis=1).fillna(0)
方法二
df.set_index('id').squeeze().apply(pd.value_counts).reset_index().fillna(0)
方法三
pd.concat([pd.Series(1, f, name=i) for _, (i, f) in df.iterrows()],
axis=1).T.fillna(0).rename_axis('id').reset_index()
我有一个 table,其中一列是二进制特征数组,当该特征存在时它们就在那里。
我想在这些行上训练逻辑模型,但无法获得所需格式的数据,其中每个特征值都是它自己的列,具有 1 或 0 值。
示例:
id feature values
1 ['HasPaws', 'DoesBark', 'CanFetch']
2 ['HasPaws', 'CanClimb', 'DoesMeow']
我想把它变成
的格式id HasPaws DoesBark CanFetch CanClimb DoesMeow
1 1 1 1 0 0
2 1 0 0 1 0
似乎内置了一些功能来实现这一点,但我想不出这种转换叫什么来做我自己更好的搜索。
您可以先将列表转换为列,然后使用get_dummies()方法:
In [12]: df
Out[12]:
id feature_values
0 1 [HasPaws, DoesBark, CanFetch]
1 2 [HasPaws, CanClimb, DoesMeow]
In [13]: (pd.get_dummies(df.set_index('id').feature_values.apply(pd.Series),
...: prefix='', prefix_sep='')
...: .reset_index()
...: )
Out[13]:
id HasPaws CanClimb DoesBark CanFetch DoesMeow
0 1 1 0 1 1 0
1 2 1 1 0 0 1
另一种选择是遍历 feature values
列,并从每个单元格构建一个系列,并将列表中的值作为索引。这样,pandas 会将系列扩展为 index
为 headers:
pd.concat([df['id'],
(df['feature values'].apply(lambda lst: pd.Series([1]*len(lst), index=lst))
.fillna(0)], axis=1)
方法一
pd.concat([df['id'], df['feature values'].apply(pd.value_counts)], axis=1).fillna(0)
方法二
df.set_index('id').squeeze().apply(pd.value_counts).reset_index().fillna(0)
方法三
pd.concat([pd.Series(1, f, name=i) for _, (i, f) in df.iterrows()],
axis=1).T.fillna(0).rename_axis('id').reset_index()