如何做 pd.get_dummies 或其他方式?

Posted

技术标签:

【中文标题】如何做 pd.get_dummies 或其他方式?【英文标题】:How to do pd.get_dummies or other ways? 【发布时间】:2018-03-22 14:35:53 【问题描述】:

其实,我的问题是基于:

Is there a faster way to update dataframe column values based on conditions?

所以,数据应该是:

import pandas as pd
import io
t="""
AV4MdG6Ihowv-SKBN_nB    DTP,FOOD
AV4Mc2vNhowv-SKBN_Rn    Cash 1,FOOD
AV4MeisikOpWpLdepWy6    DTP,Bar
AV4MeRh6howv-SKBOBOn    Cash 1,FOOD
AV4Mezwchowv-SKBOB_S    DTOT,Bar
AV4MeB7yhowv-SKBOA5b    DTP,Bar
"""
data_vec=pd.read_csv(io.StringIO(t),sep='\s2,',names=['id','source'])
data_vec

这是data_vec:

    id  source
0   AV4MdG6Ihowv-SKBN_nB    DTP,FOOD
1   AV4Mc2vNhowv-SKBN_Rn    Cash 1,FOOD
2   AV4MeisikOpWpLdepWy6    DTP,Bar
3   AV4MeRh6howv-SKBOBOn    Cash 1,FOOD
4   AV4Mezwchowv-SKBOB_S    DTOT,Bar
5   AV4MeB7yhowv-SKBOA5b    DTP,Bar

如果我想要如下结果:(这意味着如何对多个标签或类别进行矢量化?)

                  _id  source_Cash 1  source_DTOT  source_DTP  Food  Bar
0  AV4MdG6Ihowv-SKBN_nB              0            0        1      1    0
1  AV4Mc2vNhowv-SKBN_Rn              1            0        0      1    0
2  AV4MeisikOpWpLdepWy6              0            0        1      0    1
3  AV4MeRh6howv-SKBOBOn              1            0        0      1    0
4  AV4Mezwchowv-SKBOB_S              0            1        0      0    1
5  AV4MeB7yhowv-SKBOA5b              0            0        1      0    1

如果重复,警告我删除!

【问题讨论】:

可能是重复的,但我不知道。无论如何,get_dummies 采用一个可以处理多个值的分隔符:data_vec.source.str.get_dummies(sep=',') @JohnE 感谢您的评论,我学到了一些新东西!不知道分隔符。 我也是!@JohnE @COLDSPEED @OP,如果您也可以关闭this question 并接受答案,那就太好了。 这不是我的问题,如果是,我会关闭它! 【参考方案1】:

您也可以这样做: 我正在做的是拆分“源”列并创建新行。然后我在源列上调用 get_dummies,然后按“id”列分组。

data_vec = pd.DataFrame(pd.concat([pd.Series(row['id'], row['source'].split(','))              
                    for _, row in data_vec.iterrows()])).reset_index()
data_vec.columns = ['source','id']

给出:

    source           id
0   DTP     AV4MdG6Ihowv-SKBN_nB
1   FOOD    AV4MdG6Ihowv-SKBN_nB
2   Cash 1  AV4Mc2vNhowv-SKBN_Rn
3   FOOD    AV4Mc2vNhowv-SKBN_Rn
4   DTP     AV4MeisikOpWpLdepWy6
5   Bar     AV4MeisikOpWpLdepWy6
6   Cash 1  AV4MeRh6howv-SKBOBOn
7   FOOD    AV4MeRh6howv-SKBOBOn
8   DTOT    AV4Mezwchowv-SKBOB_S
9   Bar     AV4Mezwchowv-SKBOB_S
10  DTP     AV4MeB7yhowv-SKBOA5b
11  Bar     AV4MeB7yhowv-SKBOA5b

然后在源列上调用 get_dummies():

result = pd.concat([data_vec.get(['id']),
                           pd.get_dummies(data_vec['source'], prefix='source')],axis=1)

result.groupby('id').sum().reset_index()

这给出了:

          id           source_Bar   source_Cash 1   source_DTOT source_DTP  source_FOOD
0   AV4Mc2vNhowv-SKBN_Rn    0               1              0        0            1
1   AV4MdG6Ihowv-SKBN_nB    0               0              0        1            1
2   AV4MeB7yhowv-SKBOA5b    1               0              0        1            0
3   AV4MeRh6howv-SKBOBOn    0               1              0        0            1
4   AV4MeisikOpWpLdepWy6    1               0              0        1            0
5   AV4Mezwchowv-SKBOB_S    1               0              1        0            0

【讨论】:

如果你这样做,你可以用逗号和堆栈分割。然而,just calling pd.get_dummies directly 不做这一切会简单得多,这是不必要的复杂。 我同意。我今天学到了一个新东西,我们可以通过逗号调用 get_dummies()。【参考方案2】:

一点str.splitpd.get_dummies 魔术,inspired by Scott Boston 和改进(从原始版本)thanks to JohnE。

df = df.set_index('id').source.str.get_dummies(',')
df.columns = df.columns.str.split().str[0].str.lower()
df = df.add_prefix('source_').reset_index()

print(df)
                     id  source_bar  source_cash  source_dtot  source_dtp  \
0  AV4MdG6Ihowv-SKBN_nB           0            0            0           1   
1  AV4Mc2vNhowv-SKBN_Rn           0            1            0           0   
2  AV4MeisikOpWpLdepWy6           1            0            0           1   
3  AV4MeRh6howv-SKBOBOn           0            1            0           0   
4  AV4Mezwchowv-SKBOB_S           1            0            1           0   
5  AV4MeB7yhowv-SKBOA5b           1            0            0           1   

   source_food  
0            1  
1            1  
2            0  
3            1  
4            0  
5            0  

【讨论】:

以上是关于如何做 pd.get_dummies 或其他方式?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn LabelEncoder 和 pd.get_dummies 有啥区别?

想知道 pd.factorize、pd.get_dummies、sklearn.preprocessing.LableEncoder 和 OneHotEncoder 之间的区别 [关闭]

pd.get_dummies 是单热编码吗?

pd.get_dummies 和 sklearn 是 python 中的一个热门编码器有啥区别? [复制]

keras.utils.to_categorical 和 pd.get_dummies 之间有啥区别吗?

在熊猫数据框的字符串类型列上应用 pd.get_dummies()?