遍历数据框中列的每一行中的列表

时间:2020-05-10 16:41:40

标签: python pandas list dataframe nlp

我从Kraggle下拉了IMDB数据集。我将两个文件合并在一起,并希望按流派探索收视率。体裁单元格包含该行的所有体裁关键字。我为每种类型(即恐怖,戏剧,喜剧等)创建了一个新列,并希望在该类型与相应列相匹配的每一行中添加一个“ x”。 我试图拆分类型列,然后遍历每一行,在相应的相应列中放置一个“ x”,但是我似乎无法使其正常运行。在每一行的每一列中都会有一个“ x”,或者对于每一行列出的第一个流派,我都会得到一个“ x”。打击是细胞读取方式的图像。

Genre Column structure

这是我目前正在尝试的方法。


    movies = pd.read_csv('IMDb movies.csv')
    ratings = pd.read_csv('IMDb ratings.csv')
    imdb = pd.merge(movies, ratings , on=['imdb_title_id'], how='inner')

    def genre_fill(n):
        list = imdb.genre.str.split(',')
        for i in list: 

            if n == 'Western':
                imdb['Western'] = 'x'
            if n == 'Drama':
                imdb[ 'Drama'] = 'x'
            if n == 'Fantasy':
                imdb['Fantasy'] = 'x'
            if n == 'Comedy':
                imdb['Comedy'] = 'x' 
            if n == 'Action':
                imdb['Action'] = 'x'
            if n == 'Adventure':
                imdb['Adventure'] = 'x' 
            if n == 'Biography':
                imdb['Biography'] = 'x'
            if n == 'Romance':
                imdb['Romance'] = 'x'
            if n == 'Mystery':
                imdb['Mystery'] = 'x'
            if n == 'Crime':
                imdb['Crime'] = 'x' 
            if n == 'Film-Noir':
                imdb['Film-Noir'] = 'x'
            if n == 'Music':
                imdb['Music'] = 'x' 
            if n == 'Horror':
                imdb['Horror'] = 'x'
            if n == 'Musical':
                imdb['Musical'] = 'x'
            if n == 'Thriller':
                imdb['Thriller'] = 'x'
            if n == 'War':
                imdb['War'] = 'x'
            if n == 'Sci-Fi':
                imdb['Sci-Fi'] = 'x'
            if n == 'Sport':
                imdb['Sport'] = 'x' 
            if n == 'Family':
                imdb['Family'] = 'x'
            if n == 'History':
                imdb['History'] = 'x' 



    for value in imdb['genre']:
        genre_fill(value)

这是我的第一个python项目。任何建议表示赞赏。

3 个答案:

答案 0 :(得分:0)

我认为您想要类似的东西

def genre_fill(n):
        list = n.str.split(',')
        for i in list: 

            if i == 'Western':
                imdb['Western'] = 'x'
            if i == 'Drama':
                imdb[ 'Drama'] = 'x'
            #etc...





答案 1 :(得分:0)

这是一种方法,希望对您有所帮助。 首先,从genre列中提取所有类型。

cols = set([i.split(',')[0] for i in df.genre.tolist()])
print(cols)

cols如下所示:

{'Action',
 'Adult',
 'Adventure',
 'Animation',
 'Biography',
 'Comedy',
 'Crime',
 'Documentary',
 'Drama',
 'Family',
 'Fantasy',
 'Film-Noir',
 'History',
 'Horror',
 'Music',
 'Musical',
 'Mystery',
 'Romance',
 'Sci-Fi',
 'Sport',
 'Thriller',
 'War',
 'Western'}

在df中创建列:

for c in cols:
    df[c] = 0

填写值:

for index, row in df.iterrows():
    for g in row['genre'].split(', '):
            df.at[index,g] = 1

此代码将为每个类型创建一列,并用1填充值。 这不是最好的方法,因为我正在使用循环。但是对于这个数据集来说还不错!

结果将是这样的:

   id Drama War Animation ...
    0   1    0     0      ...
    1   0    1     1      ...   

请告诉我它是否对您有用。

答案 2 :(得分:0)

我认为最好的方法是不要输入“ x”或任何字母,而应该输入1或0。稍后进行一些计算会更容易。

也就是说,我将执行以下操作(为此,您需要以导入“ pandas”的方式导入numpy库->将numpy导入为np):

  1. 为所有性别设定一组(这样就不会得到重复的值)

genre_list = {i.strip() for i in np.hstack(df['genre'].map(lambda x: x.split(',')))}

  1. 为每种类型创建一列,如果性别出现在该行上,则放置1;否则显示0。如果该字符串在我正在查找的文本中不存在,则'find'方法返回-1

for i in genre_list: df[i] = df['genre'].map(lambda x: 1 if x.find(i) > 0 else 0)

我希望它有用,让我知道它是否有效。