如何做 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 callingpd.get_dummies
directly 不做这一切会简单得多,这是不必要的复杂。
我同意。我今天学到了一个新东西,我们可以通过逗号调用 get_dummies()。【参考方案2】:
一点str.split
和pd.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 和 sklearn 是 python 中的一个热门编码器有啥区别? [复制]