df3 ['col_two']具有电影体裁的嵌套列表。我正在尝试针对这些类型的每一行进行虚拟化。我认为我遇到的问题是str.get_dummies()可以工作,但当然它会将例如“ Adventure”和“ Adventure”]读作两种不同的东西,但是我想要的显然是每种类型都有一列(即冒险”列。
我已经尝试过像这样的pd.series.replace():
df3['col_two'].replace({'[':''})
或类似的np.array
df3['col_two'] = np.array(df3['col_two'])
但它们都给出相同的错误:
AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
df['genres'] = df['genres'].str.split(pat='|')
df3 = pd.melt(df, id_vars=['id'], value_vars=['genres'], var_name='col_one',
value_name='col_two')
df3.head()
id col_one col_two
0 135397 genres [Action, Adventure, Science Fiction, Thriller]
1 76341 genres [Action, Adventure, Science Fiction, Thriller]
2 262500 genres [Adventure, Science Fiction, Thriller]
3 140607 genres [Action, Adventure, Science Fiction, Fantasy]
4 168259 genres [Action, Crime, Thriller]
df4 = df3["col_two"].str.get_dummies(",")
df4.head()
'Action' 'Action'] 'Adventure' 'Adventure'] 'Animation' 'Animation'] 'Comedy' 'Comedy'] 'Crime' 'Crime'] ... ['Romance'] ['Science Fiction' ['Science Fiction'] ['TV Movie' ['Thriller' ['Thriller'] ['War' ['War'] ['Western' ['Western']
0 0 0 1 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 0 0 1 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 1 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 1 0 ... 0 0 0 0 0 0 0 0 0 0
我想做的是,由于不需要的多余字符(例如“]”等),每个流派都有一列没有奇怪的重复。并且沿列通常使用0或1个虚拟变量。
对最后一个df怪异的布局表示歉意,并预先感谢您的每一个回答。
答案 0 :(得分:0)
简化的列的简单 .join 应该可以正常工作。试试这个:
df = df[['id', 'col_one']].join(df['col_two'].str.join('|').str.get_dummies().add_prefix('GENRE_'))
让我知道这是否适合您!
答案 1 :(得分:0)
您可以使用str.translate
和str.maketrans
删除字符,然后使用get_dummies
:
no_bracket = df['col_two'].str.translate(str.maketrans('', '', '[]'))
no_bracket.str.get_dummies(',')
此post和str.translate
的{{3}}应该提供有关参数的更多信息。