我有一个看起来像这样的数据框:
data = {'X':['A, B, C'], 'Y':[['apple, pear, berries'], ['milk, butter, eggs'], ['apple, milk, bread']]}
data = pd.DataFrame(data)
我正在尝试遍历“ Y”列以拆分“,”,并保存到仅存储唯一值的空列表中。
我尝试过:
list = data['Y'].tolist()
new_list = set(list)
但是它不返回我想要的。
任何帮助将不胜感激。
预期的输出将类似于显示的列表:
['apple', 'pear', 'berries', 'milk', 'butter', 'eggs', 'bread']
答案 0 :(得分:3)
尝试此单行代码,不使用熊猫:
data = {'X':['A', 'B', 'C'], 'Y':[['apple', 'pear', 'berries'], ['milk', 'butter', 'eggs'], ['apple', 'milk', 'bread']]}
list(set(sum(data['Y'], [])))
# output: ['apple', 'milk', 'bread', 'pear', 'eggs', 'butter', 'berries']
您可以将我的解决方案与基于熊猫的解决方案进行比较:
%%timeit
list(set(sum(data['Y'], [])))
# 805 ns ± 4.84 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
# Without df creation
%%timeit
#df = pd.DataFrame(data)
l = df['Y'].values.tolist() # this will have the same as data['Y']
new_list = list(set(reduce(lambda x,y: x+y,l)))
# 5.75 µs ± 220 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
# With df creation
%%timeit
df = pd.DataFrame(data)
l = df['Y'].values.tolist() # this will have the same as data['Y']
new_list = list(set(reduce(lambda x,y: x+y,l)))
# 658 µs ± 23.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
从以前的结果中可以看到,我的解决方案似乎比基于熊猫的解决方案有效得多。 简单更好:-)
答案 1 :(得分:1)
您的逻辑可能存在缺陷。首先,不要使用list
作为变量名,因为这是Python的内置函数。
第二,我想您还不清楚data
是一个词典,因此data['Y']
会给您一个列表清单。因此,您将无法应用与数据框一起使用的方法。
第三,您可以使用reduce
函数获得预期的输出
我相信您想将data
转换为数据框,因此请使用以下内容:
import pandas as pd
from functools import reduce
data = {'X':['A', 'B', 'C'], 'Y':[['apple', 'pear', 'berries'], ['milk', 'butter', 'eggs'], ['apple', 'milk', 'bread']]}
df = pd.DataFrame(data)
l = df['Y'].values.tolist() # this will have the same as data['Y']
new_list = list(set(reduce(lambda x,y: x+y,l)))
您可以节省一些时间,方法是不转换为数据帧,而将reduce函数直接应用于data['Y']
:
new_list = list(set(reduce(lambda x,y: x+y, data['Y'])))
输出
['apple', 'berries', 'bread', 'butter', 'eggs', 'milk', 'pear']