首页 > 解决方案 > 如何编写一个需要一行并返回二维元组列表的函数

问题描述

所以我正在研究这个数据集。

在此处输入图像描述

我想取一行并返回二维元组。例如,对于第 0 行,它返回:[('Action', 7.9), ('Adventure', 7.9), ('Fantasy', 7.9), ('Sci-Fi', 7.9)]。这样电影中的每种类型都将是相同的 imdb 分数。

这是来自一个学校项目,我想不出办法可以做到这一点。谁能帮我?

对不起,由于这个问题缺乏细节,我现在将尝试列出所有细节。

数据集是 movie_metadata.csv。我似乎无法在此处附加文件。

在我得到函数后,我应该将该函数应用于所有行,直到我有一个包含所有二维元组的列表。然后我必须将元组列表转换为数据框。理想情况下,我想创建一个名为“genre_score”的新数据集,它有两列:genre 和 imdb_score。每行将只有一个流派和该流派的电影的 IMDB 评级。然后我必须计算每个流派的平均 IMDB 评级并制作下图。

在此处输入图像描述

除了功能之外,我可能可以用其他所有东西来解决问题。编写函数对我来说是一场斗争。

标签: pythonpandas

解决方案


使用列表推导,将值拆分为|

df = pd.DataFrame({'genres':['Action|Adventure|Fantasy|Sci-Fi','Action|Adventure|Fantasy'],
                   'imdb_score':[7.9,7.1]})
print (df)
                            genres  imdb_score
0  Action|Adventure|Fantasy|Sci-Fi         7.9
1         Action|Adventure|Fantasy         7.1

row = 0
L = [(x, i) for g,i in df.loc[[row], ['genres','imdb_score']].values for x in g.split('|')]
print (L)
[('Action', 7.9), ('Adventure', 7.9), ('Fantasy', 7.9), ('Sci-Fi', 7.9)]

编辑:Series.str.get_dummies用于指标列,多个 by DataFrame.mul,替换0为缺失值并获取means,最后转换SeriesDataFramebySeries.rename_axisSeries.reset_index

df1 = (df['genres'].str.get_dummies()
                   .replace(0, np.nan)
                   .mul(df['imdb_score'], axis=0)
                   .mean()
                   .rename_axis('genres')
                   .reset_index(name='imdb_score'))
print (df1)
      genres  imdb_score
0     Action         7.5
1  Adventure         7.5
2    Fantasy         7.5
3     Sci-Fi         7.9

另一种解决方案是Series.str.split用于列表和DataFrame.explode最后聚合mean

df1 = (df.assign(genres=df['genres'].str.split('|'))
         .explode('genres')
         .groupby('genres', as_index=False)['imdb_score']
         .mean())
print (df1)
      genres  imdb_score
0     Action         7.5
1  Adventure         7.5
2    Fantasy         7.5
3     Sci-Fi         7.9

推荐阅读