【问题标题】:How do I write a function that takes one row and returns a list of 2-dimension tuples如何编写一个需要一行并返回二维元组列表的函数
【发布时间】:2020-07-24 02:59:39
【问题描述】:

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

我想取一行并返回二维元组。例如,对于第 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 评分并制作下图。

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

【问题讨论】:

  • 你能发布文本数据吗?因为无法从图片中复制数据。
  • 我希望我用我添加的细节回答了你。

标签: python pandas


【解决方案1】:

使用由| 拆分的扁平值的列表推导:

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 用于指标列,乘以DataFrame.mul,将0 替换为缺失值并得到means,最后将Series 转换为DataFrame,由Series.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

【讨论】:

  • 很抱歉再次打扰你,但你介意在我们找到每种类型的平均值之前向我解释你如何获得列表。只是为了让我可以看到每种类型列出了多少部电影。我想剔除少于 10 部电影的类型,以便数据更准确。
  • @CarloSilanu - 所以需要this?像df1 = (df.assign(genres=df['genres'].str.split('|')) .explode('genres')) 然后从链接应用解决方案然后df1 = df1.groupby('genres', as_index=False)['imdb_score'] .mean())
【解决方案2】:

试试这个:

array = [ (col,val) for col,val in dataframe.iloc[row_num].items() ]
print(array)

【讨论】:

    【解决方案3】:

    您可以在字典中使用字典

    dataset = {'R1':{'C1':'V1','C2':'V2','C3':'V3'},
    'R2':{'C1':'V1','C2':'V2','C3':'V3'},
    'R3':{'C1':'V1','C2':'V2','C3':'V3'}
    }
    

    【讨论】:

      【解决方案4】:

      你可以让你的功能像这样

      def myFunction(row):
          row += 1
          // Your list
          mylist = [
              // first row
              [
                  ('genres', 'Action|Adventure|Fantasy|Sci-Fi'),
                  ('num_user_for_reviews', 3054.0)],
              ],
              // second row
              [
                  ('genres', 'Action|Adventure|Fantasy'),
                  ('num_user_for_reviews', 1238.0)]
              ]
          return myList[row]
      
      

      然后调用函数并填写你想要的行

      // return firstrow
      muFunction(1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-29
        相关资源
        最近更新 更多