Python 正在寻找加速以下代码的方法
我的数据集中有三列,其中包含存储为字符串的元素列表。我想得到元素,它是所有这些列表的公共部分 要记住的一些事情: 1) 列可以包含“NAN”值,而不是列表 2) 如果有多个公共元素,那么选择哪一个并不重要 我编写了以下函数,它将包含这三个相关列的数据框作为参数:Python 正在寻找加速以下代码的方法,python,pandas,Python,Pandas,我的数据集中有三列,其中包含存储为字符串的元素列表。我想得到元素,它是所有这些列表的公共部分 要记住的一些事情: 1) 列可以包含“NAN”值,而不是列表 2) 如果有多个公共元素,那么选择哪一个并不重要 我编写了以下函数,它将包含这三个相关列的数据框作为参数: def parse_类型(df): def get_类型(行): 行列表=[] 对于行中的元素: 如果元素!='楠: y=ast.literal\u eval(元素) 对于y类型: 如果流派不在行列表中: 行列表+=类型 唯一=设置(行
def parse_类型(df):
def get_类型(行):
行列表=[]
对于行中的元素:
如果元素!='楠:
y=ast.literal\u eval(元素)
对于y类型:
如果流派不在行列表中:
行列表+=类型
唯一=设置(行列表)
返回列表(唯一)[0]
结果=df.apply(获取类型)
返回结果
输入:
index col1 col2 col3
0 NAN NAN NAN
1 ['hip hop', 'trap'] ['indie', 'trap'] NAN
2 ['pop', 'viral pop'] ['dance pop', 'pop', 'post-teen pop'] NAN
预期产出:
index col
0 NAN
1 'trap'
2 'pop'
我们做了一些优化。看看这是否有帮助
import pandas as pd
import numpy as np
data = {
'col1': [np.nan,['hip hop', 'trap'],['pop', 'viral pop','post-teen pop']],
'col2': [np.nan,['indie', 'trap'],['dance pop', 'pop', 'post-teen pop']],
'col3': [np.nan,np.nan,np.nan]
}
df = pd.DataFrame(data)
result_df = pd.DataFrame(columns=['common_words'])
for idx, rows in enumerate(df.iterrows()):
new_set = None
valid_set_found = False
for i in range(len(rows[1])):
if isinstance(rows[1][i], list):
if valid_set_found is False:
new_set = set(rows[1][i])
valid_set_found = True
continue
new_set = set(rows[1][i]) & new_set
if new_set is None:
result_df.loc[idx] = np.nan
else:
new_list = list(new_set)
result_df.loc[idx] = [new_list]
print(df)
print(result_df)
Input :
col1 col2 col3
0 NaN NaN NaN
1 [hip hop, trap] [indie, trap] NaN
2 [pop, viral pop, post-teen pop] [dance pop, pop, post-teen pop] NaN
Output :
common_words
0 NaN
1 [trap]
2 [pop, post-teen pop]
添加一组示例输入和预期输出将有所帮助。如果使用
如果流派不在行列表中
,则创建具有唯一值的列表,而不需要set()
。或者将所有字符串转换为列表,然后将所有列表转换为集合,并执行set1&set2&set3
以获得唯一值。