【发布时间】:2021-09-23 11:06:13
【问题描述】:
例如,
input.csv如下:
| Song Name | Genre |
|---|---|
| 7 Rings | 'dance pop', 'pop', 'post-teen pop' |
| Run | 'dance pop', 'piano rock', 'pop', 'pop rock' |
| Dance Monkey | 'australian pop', 'pop' |
| All Of Me | 'neo soul', 'pop', 'pop soul', 'r&b', 'urban contemporary' |
我想以一种我可以得到类似的方式对其进行分组:
pop: ['7 Rings', 'Run', 'Dance Monkey', 'All Of Me']
dance pop : ['7 Rings','Run']
r&b: ['All Of Me']
甚至将其放入另一个表/数据框/csv 中,例如:
| pop | dance pop | r&b | neo soul | pop rock |
|---|---|---|---|---|
| 7 Rings | 7 Rings | All Of Me | All Of Me | Run |
| Run | Run | |||
| Dance Monkey | ||||
| All Of Me |
有没有办法做到这一点?
编辑:
尝试了 mozway 的建议,我得到了一个看起来像这样的表格:
genreExplode=df.explode('Genre').assign(index=lambda d: d.groupby('Genre').cumcount()).pivot(index='index', columns='Genre', values='Song Name').fillna('')
genreExplode.head()
| Genre | 'dance pop', 'pop', 'post-teen pop' | 'dance pop', 'piano rock', 'pop', 'pop rock' | 'australian pop', 'pop' | 'neo soul', 'pop', 'pop soul', 'r&b', 'urban contemporary' |
|---|---|---|---|---|
| index | ||||
| 0 | 7 Rings | Run | Dance Monkey | All Of Me |
编辑 2:
找出问题所在,Genre 列中的对象看起来像列表,但实际上是字符串。
genrelist=df['Genre'].tolist() ##first make a list of the Genre column
genrelist_new=[] ## new list to hold lists
import ast ## found this online
for x in genrelist:
x=ast.literal_eval(x) ##this loop takes the string objects that look like list in genrelist and converts them into list
genrelist_new.append(x) ##then add the converted list and put into a list
df['Genre']=genrelist_new ##replace old Genre column of strings that look like lists to new column of real lists
genreExplode=spotData.explode('Genre').assign(index=lambda d: d.groupby('Genre').cumcount()).pivot(index='index', columns='Genre', values='Song Name').fillna('')
genreExplode.head() ## this result is what I was looking for!
解决办法,将字符串转换成真实的列表,这样Genre列就是列表的列表。
那么@mozway 的代码可以完美运行。
【问题讨论】:
-
原始 csv 列中的流派也放在方括号中,如 ['pop','rock','dance'],但我无法显示它,因为它会触发我的警告即使不是代码,代码也没有正确格式化。
-
考虑将您的解决方案放在答案中,以便将问题标记为已解决。