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

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

此时,我们可以生成第一个有意义的可视化。

fig, ax=plt.subplots(figsize= (14,4))
ax.bar(to_1D(fruits["favorite_fruits"]).value_counts().index,
to_1D(fruits["favorite_fruits"]).value_counts().values)
ax.set_ylabel("Frequency", size=12)
ax.set_title("Children's Favorite Fruits", size=14)

640.png

图4 -显示所有水果的频率的条形图。

问题3:针对有唯一值的单独列

如果您对我们之前得到的结果感到满意,就到此为止吧。但是,您的研究目标可能需要更深层次的分析。也许您希望将所有列表元素相互关联以计算相似度得分。比如吃香蕉的孩子也喜欢芒果吗?或者你想知道哪些水果是大多数孩子最喜欢的水果。这些问题只能通过更深层次的分析才能得到答案。

为此,我将介绍两种有用的方法。它们的复杂性不同。

方法一

这是我偶然发现的一个非常简单快速的方法。而且它非常有用!您只需要一行代码。

fruits_expanded_v1=fruits["favorite_fruits"].apply(pd.Series)

640.png

图5 -使用方法1的水果列表的扩展版本

正如您所看到的,这单独生成了一个dataframe,每个列表都分为单个元素。有了这个方法,您将总是得到一个具有一个(n,len(lonsig_list))dataframe。在这种情况下,10个孩子中有两个叫了5个最喜欢的水果,结果是一个10x5dataframe

通过这个,我们就可以知道哪些水果是人们最喜欢的水果。

fruits_expanded_v1.iloc[:,0].value_counts(normalize=True)##OUTPUT##banana0.222222pear0.111111watermelon0.111111blueberry0.111111strawberry0.111111apple0.111111peach0.111111mango0.111111

我们可以看到香蕉是孩子们最喜欢的水果。

或者,我们可以以单个水果为目标,找出它们在列表的每个位置被命名的次数。这是我写的函数:

defget_rankings(item, df):
#Emptydictforresultsitem_count_dict= {}
#Foreverytagindfforiinrange(df.shape[1]):
#Calculate%ofcasesthattaggedtheitemval_counts=df.iloc[:,i].value_counts(normalize=True)
ifiteminval_counts.index:
item_counts=val_counts[item]
else:
item_counts=0#Addscoretodictitem_count_dict["tag_{}".format(i)] =item_countsreturnitem_count_dict

如果我们应用它,我们得到:

get_rankings(item="apple", df=fruits_expanded_v1)##OUTPUT##{'tag_0': 0.1111111111111111, 'tag_1': 0.1111111111111111, 'tag_2': 0.2222222222222222, 'tag_3': 0.2, 'tag_4': 0}

正如您所看到的,我们可以用这种方法进行大量的基于rpc的分析。然而,这种方法几乎没有其他用处。因为列不代表一个标记,而是一个级别,大多数在标签上的操作不能正确地完成。例如,计算香蕉和桃子之间的相关性是不可能的,我们从方法1得到了dataframe。如果这是你的研究目标,使用下一种方法。

方法二

这种方法更加复杂,需要更多的空间。其思想是,我们创建一个dataframe,其中的行与以前相同,但每个水果都被分配了自己的列。如果只有孩子#2命名为banana,那么banana列在第2行将具有“True”值,而在其他地方将具有“False”值(参见图6)。我写了一个函数来执行这个操作。它依赖于循环,这意味着它将花费大量时间处理大型数据集。然而,在我所尝试的所有方法中,这是最有效的方法。

defboolean_df(item_lists, unique_items):#Createemptydictbool_dict= {}
#Loopthroughallthetagsfori, iteminenumerate(unique_items):
#Applybooleanmaskbool_dict[item] =item_lists.apply(lambdax: iteminx)
#Returntheresultsasadataframereturnpd.DataFrame(bool_dict)

如果我们现在应用这个函数

fruits_bool=boolean_df(fruits[“favorite_fruits”], unique_items.keys())

我们得到这个表格:640.png


图6 - 布尔表格。

从这里,我们可以很容易地计算相关性。请注意,“相关性”并不是真正正确的术语,因为我们使用的不是度量或序数数据,而是二进制数据。

同样,有多种方法来关联这些水果。一个直接的方法是皮尔逊相关系数,它也可以用于二进制数据。Pandas对此有一个内置函数。

fruits_corr=fruits_bool.corr(method="pearson")

640.png

图7 -皮尔逊相关数据图

另一种方法是简单地数一种水果和其他水果一起被命名的次数。这可以用矩阵乘法来解决。为此,我们需要将布尔型1转换为整数。

fruits_int=fruits_bool.astype(int)

然后,我们可以计算频率。

fruits_freq_mat=np.dot(fruits_int.T, fruits_int)
##OUTPUT##array([[5, 3, 3, 2, 2, 1, 1, 1, 0, 2, 0, 1],
      [3, 4, 2, 1, 1, 1, 1, 2, 1, 0, 1, 1],
      [3, 2, 4, 3, 1, 2, 0, 0, 0, 1, 0, 0],
      [2, 1, 3, 4, 2, 2, 0, 0, 0, 1, 0, 0],
      [2, 1, 1, 2, 3, 1, 0, 0, 0, 1, 0, 0],
      [1, 1, 2, 2, 1, 3, 0, 0, 0, 0, 0, 0],
      [1, 1, 0, 0, 0, 0, 2, 1, 1, 0, 1, 1],
      [1, 2, 0, 0, 0, 0, 1, 2, 1, 0, 1, 1],
      [0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 2, 0],
      [2, 0, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0],
      [0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 2, 0],
      [1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1]])

现在我们需要做的就是添加标签并将其转换为dataframe

fruits_freq=pd.DataFrame(fruits_freq_mat, columns=unique_items.keys(), index=unique_items.keys())

640.png

图8 -频率数据表。

如果你正在寻找一个漂亮的可视化方式,你可以创建一个seaborn库热图。

importseabornassnfig, ax=plt.subplots(figsize= (9,5))
sn.heatmap(fruits_freq, cmap="Blues")
plt.xticks(rotation=50)
plt.savefig("heatmap.png", dpi=300)

640.png

图9 -热图。

利用皮尔逊矩阵,我们可以很容易地建立一个水果推荐系统。例如,如果你输入你喜欢香蕉,它会推荐你吃西番莲,因为这两者的相关性最高(0.67)。您会对这种简单的方法的强大程度感到惊讶。我已经成功地用过很多次了。如果您想对频率 dataframe做类似的事情,您需要首先对数据进行规范化。然而,这是另一篇文章的主题。

我希望这个指南对你有用,可以节省您的时间。谢谢大家的阅读!

目录
相关文章
|
数据处理 Python
|
Python
pandas 数据循环修改列后保存为csv文件
pandas 数据循环修改列后保存为csv文件
277 0
|
存储 数据挖掘 数据格式
Pandas的列表值处理技巧,避免过多循环加快处理速度(上)
Pandas的列表值处理技巧,避免过多循环加快处理速度
148 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