Pandas的列表值处理技巧,避免过多循环加快处理速度(上)

简介: Pandas的列表值处理技巧,避免过多循环加快处理速度

这里有一些技巧可以避免过多的循环,从而获得更好的结果


640.png

图1 -标题图像。

您曾经处理过需要使用列表的数据集吗?如果有,你就会明白这有多痛苦。如果没有,你最好做好准备。

如果你仔细看,你会发现列表无处不在!下面是一些实际问题,您可能会遇到列表。

  • 音频或视频标签
  • 调查数据中的开放式问题
  • 参与创作作品的所有作者、艺术家、制作人等的名单

640.png

图2 -一个有趣的猫有关的视频的标签列表。

我最近参与了多个项目,这些项目要求我分析这类数据。在经历了几个小时的痛苦摸索之后,我意识到必须在这里分享我的知识来帮助您节省时间。

我将向您展示您可能会遇到的各种问题,并为它们提供实用的解决方案。

准备

要遵循本教程,请下载用于所有示例的虚拟数据集。包括代码在内的所有资料都可以在这里找到。

另外,请导入所有必要的库并加载数据格式。

importpandasaspdimportnumpyasnpimportmatplotlibaspltfruits=pd.read_csv("fruits.csv", delimiter=";")

640.png

图3 -数据集示例

列表值有什么问题呢?

让我们直击要点:列表值打乱了您所知道的关于数据分析的一切。如果没有无尽的循环,甚至不能执行最简单的操作。让我给你们看一个简单的例子:

对于示例数据集中的“age”列,我们可以轻松地使用value_counts()函数来计算观察到的年龄数据集的数量。

fruits["age"].value_counts()##OUTPUT##8310262917151

如果我们想知道哪些水果被命名得最多呢?原则上,我们在“favorite_fruits”列中获得了所需的所有数据。然而,如果我们应用相同的函数,结果是没有帮助的。

fruits["favorite_fruits"].value_counts()##OUTPUT##["strawberry", "raspberry", "blueberry"]                     1["mango", "pineapple", "orange"]                             1["blueberry", "watermelon", "apple", "raspberry"]             1["apple", "pear", "peach"]                                   1["pear", "strawberry", "raspberry"]                           1["banana", "maracuja", "watermelon", "apple", "pineapple"]   1["peach", "strawberry", "apple", "blueberry"]                 1[]                                                           1["banana", "mango", "orange", "watermelon"]                   1["watermelon", "apple", "blueberry", "pear", "strawberry"]   1

这不起作用的原因是,Pandas不能直接访问列表中的每个元素。因此,它无法正确地应用value_counts()等函数。那么,我们该怎么做呢?我将在下面向您展示!

问题1:列表存储为字符串

您经常会遇到的一个问题是,panda将以字符串的形式读取列表,而不是以列表的形式。

fori, linenumerate(fruits["favorite_fruits"]):
print("list",i,"is",type(l))##OUTPUT##list0is<class'str'>list1is<class'str'>list2is<class'str'>list3is<class'str'>list4is<class'str'>list5is<class'str'>list6is<class'str'>list7is<class'str'>list8is<class'str'>list9is<class'str'>

这意味着您甚至不能遍历列表来计算惟一值或频率。根据您的列表在dataframe格式化方式的,有一种简单的或复杂的解决方案。在任何情况下,您都可以使用我提供的代码。

你的字符串是这样的吗:“[‘strawberry’, ‘apple’, ‘orange’]”

在这种情况下,有一个使用apply()eval()函数的快速方法。

fruits["favorite_fruits"] =fruits["favorite_fruits"].apply(eval)

你的字符串是这样的吗:“[strawberry, apple, orange]”?

这个类型比较困难,eval()函数因为列表缺少内部引号而不能工作,以便将其识别为一个列表对象。快速而粗糙的解决方案是简单地向字符串添加引号,然后应用eval()。使用这个函数:

defclean_alt_list(list_):
list_=list_.replace(', ', '","')
list_=list_.replace('[', '["')
list_=list_.replace(']', '"]')
returnlist_

应用到dataframe时,请使用此伪代码:

df[col] =df[col].apply(clean_alt_list)

注意,在这两种情况下,Pandas仍然会为系列分配一个“O”数据类型,这通常用于字符串。但是不要让这个迷惑了你。你可以使用检查实际的数据类型:

fori, linenumerate(fruits[“favorite_fruits”]):
print(“list”,i,”is”,type(l))##OUTPUT##list0is<class'list'>list1is<class'list'>list2is<class'list'>list3is<class'list'>list4is<class'list'>list5is<class'list'>list6is<class'list'>list7is<class'list'>list8is<class'list'>list9is<class'list'>

问题2:获得特定的列表值

在这第一步之后,我们的数据集最终被Pandas认可。但是,我们仍然不能使用标准函数,因为它们不是为列表设计的。

至少我们现在可以使用循环。这个方法适合于小数据集,但会非常慢。例如,我如果分析高达999个标签,大约有500k音乐曲目的数据集。这意味着,内部循环将会有数亿次,这将花费数小时,并可能使我的计算机崩溃。我能给你展示一个更干净、更快的方法,在一分钟内完成此任务。然而,如果您真的想使用循环,下面是代码:

fruit_dict= {}
foriinfruits["favorite_fruits"]:
forjinj:
ifjnotinfruit_dict:
fruit_dict[j] =1else:
fruit_dict[j] +=1

我花了一段时间才弄清楚。如果我们将列表数据集化作为一个2D数组,然后将其维度从2减少到1,将允许我们再次应用经典的Pandas功能。为此,您可以使用这个函数:

defto_1D(series):
returnpd.Series([xfor_listinseriesforxin_list])

如果我们现在使用value_counts(),就会得到我们想要的结果。

to_1D(fruits[“favorite_fruits”]).value_counts()##OUTPUT##apple5blueberry4watermelon4strawberry4raspberry3pear3banana2pineapple2mango2peach2orange2maracuja1

要获得惟一的值,只需将.index()链接到上面的结果中提取它们。

目录
相关文章
|
数据处理 Python
|
Python
pandas 数据循环修改列后保存为csv文件
pandas 数据循环修改列后保存为csv文件
277 0
|
数据可视化 搜索推荐 Python
Pandas的列表值处理技巧,避免过多循环加快处理速度(下)
Pandas的列表值处理技巧,避免过多循环加快处理速度
130 0
Pandas的列表值处理技巧,避免过多循环加快处理速度(下)
|
索引 Python
Pandas大数据分析之列表重塑和透视
引入 在处理数据文件的时候,我们往往需要通过自己再处理来获得方便分析的数据表。这时候会经常用得到的操作就包括了重塑和透视。本期将对这个两个操作进行讲解,希望大家都能作出令自己满意的分析结果~
Pandas大数据分析之列表重塑和透视
|
资源调度 BI 项目管理
第一章 pandas预备知识(列表推导式与条件赋值、匿名函数与map方法、zip对象与enumerate方法、np基础 )
第一章 pandas预备知识(列表推导式与条件赋值、匿名函数与map方法、zip对象与enumerate方法、np基础 )
136 0
|
数据挖掘 Android开发 Python
数据分析实战 | Pandas交叉列表探寻用户数下降的原因
数据分析实战 | Pandas交叉列表探寻用户数下降的原因
数据分析实战 | Pandas交叉列表探寻用户数下降的原因
|
人工智能 Python
Python 将列表数据生成折线图(Pandas使用)
Python 将列表数据生成折线图(Pandas使用)
Python 将列表数据生成折线图(Pandas使用)
|
1月前
|
机器学习/深度学习 数据可视化 搜索推荐
Python在社交媒体分析中扮演关键角色,借助Pandas、NumPy、Matplotlib等工具处理、可视化数据及进行机器学习。
【7月更文挑战第5天】Python在社交媒体分析中扮演关键角色,借助Pandas、NumPy、Matplotlib等工具处理、可视化数据及进行机器学习。流程包括数据获取、预处理、探索、模型选择、评估与优化,以及结果可视化。示例展示了用户行为、话题趋势和用户画像分析。Python的丰富生态使得社交媒体洞察变得高效。通过学习和实践,可以提升社交媒体分析能力。
51 1
|
1月前
|
数据挖掘 Python
【Python】已解决:Python pandas读取Excel表格某些数值字段结果为NaN问题
【Python】已解决:Python pandas读取Excel表格某些数值字段结果为NaN问题
66 0
|
17天前
【Pandas+Python】初始化一个全零的Dataframe
初始化一个100*3的0矩阵,变为Dataframe类型,并为每列赋值一个属性。
13 2