在各自的单热编码列中填充分类数据的值
Populate values for categorical data in their respective one-hot encoded columns
我有一个包含 100 列和行的 csv 文件。
有两列是我的兴趣,基于此我需要在该 csv 文件中创建新列。
例子:
我感兴趣的列如下,
input.csv
count description
1 Good
2 Medium
2 Best
1 Worst
2 Worst
1 Medium
9 Good
我预期的输出,
output.csv
count description Good Medium Best Worst
1 Good 1 0 0 0
2 Medium 0 2 0 0
2 Best 0 0 2 0
1 Worst 0 0 0 1
2 Worst 0 0 0 1
1 Medium 0 1 0 0
9 Good 9 0 0 0
在上面的 csv table 中,基于 'count' 和 'description' 的值。
我正在创建新列 Good、Medium、Best、Worst(来自描述值)并填充 count 中的值并将 null 放入该行的不可用值。
我尝试比较列并映射值,但无法将值正确放入新列中。
一种方法是使用 pd.get_dummies
, and multiply
和 df['count]
创建虚拟列以获得所需的输出:
d = pd.get_dummies(df.description)
df.assign(**d.multiply(df['count'], axis=0))
count description Best Good Medium Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0
您可以旋转并添加原始框架:
f = df.pivot(columns='description', values='count').fillna(value=0, downcast='infer')
df[['count', 'description']].merge(f, left_index=True, right_index=True)
这导致:
count description Best Good Medium Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0
str.get_dummies
为了提高性能和简洁性,请使用 str.get_dummies
和广播的 numpy 乘法。
v = df['description'].str.get_dummies()
df.join(pd.DataFrame(
v.values * df['count'].values[:, None], columns=v.columns))
count description Best Good Medium Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0
I now see this is a slightly different version of @nixon's
answer, but hopefully
the difference in how broadcasting is performed should excuse me :-)
pivot
和 fillna
或者,OP 的 pivot
解决方案的修改版本:
df.join(df.reset_index()
.pivot(index='index', columns='description', values='count')
.fillna(0, downcast='infer'))
count description Best Good Medium Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0
感谢您的上述回答。
我也试过,解决方法如下,
import pandas as pd
df = pd.read_csv('/input.csv')
res = df.pivot(index='index', columns='description', values='count')
res.to_csv('/out.csv',',',dtype='unicode8')
res1 = res.replace('NaN', '0', regex=True)
res1.to_csv('/out1.csv',',',dtype='unicode8')
谢谢,
桑达尔
我有一个包含 100 列和行的 csv 文件。 有两列是我的兴趣,基于此我需要在该 csv 文件中创建新列。 例子: 我感兴趣的列如下, input.csv
count description
1 Good
2 Medium
2 Best
1 Worst
2 Worst
1 Medium
9 Good
我预期的输出, output.csv
count description Good Medium Best Worst
1 Good 1 0 0 0
2 Medium 0 2 0 0
2 Best 0 0 2 0
1 Worst 0 0 0 1
2 Worst 0 0 0 1
1 Medium 0 1 0 0
9 Good 9 0 0 0
在上面的 csv table 中,基于 'count' 和 'description' 的值。 我正在创建新列 Good、Medium、Best、Worst(来自描述值)并填充 count 中的值并将 null 放入该行的不可用值。 我尝试比较列并映射值,但无法将值正确放入新列中。
一种方法是使用 pd.get_dummies
, and multiply
和 df['count]
创建虚拟列以获得所需的输出:
d = pd.get_dummies(df.description)
df.assign(**d.multiply(df['count'], axis=0))
count description Best Good Medium Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0
您可以旋转并添加原始框架:
f = df.pivot(columns='description', values='count').fillna(value=0, downcast='infer')
df[['count', 'description']].merge(f, left_index=True, right_index=True)
这导致:
count description Best Good Medium Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0
str.get_dummies
为了提高性能和简洁性,请使用 str.get_dummies
和广播的 numpy 乘法。
v = df['description'].str.get_dummies()
df.join(pd.DataFrame(
v.values * df['count'].values[:, None], columns=v.columns))
count description Best Good Medium Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0
I now see this is a slightly different version of @nixon's answer, but hopefully the difference in how broadcasting is performed should excuse me :-)
pivot
和 fillna
或者,OP 的 pivot
解决方案的修改版本:
df.join(df.reset_index()
.pivot(index='index', columns='description', values='count')
.fillna(0, downcast='infer'))
count description Best Good Medium Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0
感谢您的上述回答。 我也试过,解决方法如下,
import pandas as pd
df = pd.read_csv('/input.csv')
res = df.pivot(index='index', columns='description', values='count')
res.to_csv('/out.csv',',',dtype='unicode8')
res1 = res.replace('NaN', '0', regex=True)
res1.to_csv('/out1.csv',',',dtype='unicode8')
谢谢, 桑达尔