pandas 有没有一个最佳的python函数来搜索某个列表中的每个元素,并查看它是否存在于一个数组的列中?

e5nqia27  于 12个月前  发布在  Python
关注(0)|答案(3)|浏览(102)

我想搜索某个列表中的每个元素,看看它是否存在于一个数组spotify_data的列中,spotify_data['Genre']是一个序列。
这是我的代码:

genre_names = take(1545, all_genres) # a function that extracts certain # of indices from dictionary
streams_on_genre = []
for genre in genre_names:
    streams = 0
    for index, row in spotify_data.iterrows():
        if genre in row['Genre']:
            streams += row['Streams']
    streams_on_genre.append(streams)

字符串

z8dt9xmd

z8dt9xmd1#

你不需要搜索数组中的每一个元素。

import pandas as pd

data = {'a': [1, 2, 3], 'b': [4, 5, 6], 'c':['apple','orange','banana']}  
df = pd.DataFrame(data)

print(5 in df['b'].values)          # prints True
print('pear' in df['c'].values)     # prints false

字符串

  • 检查5是否在列B中。因为它是,它返回True
  • 检查pear是否在列c中。由于它是not,它返回False

您可以对所有数据类型执行此操作。

mbyulnm0

mbyulnm02#

看起来你想计算你感兴趣的流派在列中出现的次数。纯pandas方法可能如下所示:

spotify_data['Genre'].value_counts().reindex(genre_names).fillna(0)

字符串
这将给你给予一个系列的计数值和索引将是流派。
或者,如果你愿意,你可以使用vanilla python获得一个计数字典:

from collections import Counter
genre_counts = Counter(spotify_data['Genre'])


然后,如果你只想要特定的计数,你可以过滤回来:

# as another dict
result_dict = {k:genre_counts[k] for k in genre_names}
# as a list
result_list = [genre_counts[k] for k in genre_names]


这两种方法都是高性能的。但是请注意,这两种方法都只检查精确匹配

y3bcpkx1

y3bcpkx13#

对于你正在做的子串匹配(不快于2 for循环)

genre_names = set(take(1545, all_genres)) # a function that extracts certain # of indices from dictionary
streams_on_genre = {genre: spotify_data["Streams"][spotify_data['Genre'].apply(lambda x: genre in x)] for genre in genre_names}

字符串
精确匹配(应该更快)

genre_names = set(take(1545, all_genres)) # a function that extracts certain # of indices from dictionary
streams_on_genre = {genre: spotify_data["Streams"][spotify_data['Genre'] == genre] for genre in genre_names}

相关问题