从列嵌套列表创建虚拟对象

时间:2019-04-19 06:53:58

标签: python pandas list

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怪异的布局表示歉意,并预先感谢您的每一个回答。

2 个答案:

答案 0 :(得分:0)

简化的列的简单 .join 应该可以正常工作。试试这个:

df = df[['id', 'col_one']].join(df['col_two'].str.join('|').str.get_dummies().add_prefix('GENRE_'))

让我知道这是否适合您!

答案 1 :(得分:0)

您可以使用str.translatestr.maketrans删除字符,然后使用get_dummies

no_bracket = df['col_two'].str.translate(str.maketrans('', '', '[]'))
no_bracket.str.get_dummies(',')

poststr.translate的{​​{3}}应该提供有关参数的更多信息。