python - 如何避免此熊猫数据帧处理的迭代
问题描述
在不使用 iterrows() 的情况下,我需要一些帮助才能将以下代码转换为更高效的代码。
for index, row in df.iterrows():
alist=row['index_vec'].strip("[] ").split(",")
blist=[int(i) for i in alist]
for col in blist:
df.loc[index, str(col)] = df.loc[index, str(col)] +1
上面的代码基本上是读取 'index_vec' 列下的一个字符串,解析并转换为整数,然后为每个整数将关联的列加一。输出示例如下所示:
以第 0 行为例。它的字符串值为“[370, 370, -1]”。因此,上面的代码将“370”列增加 2,将“-1”列增加 1。输出显示被截断,因此仅显示“-10”到“17”列。
使用 iterrows() 处理大型数据帧非常慢。我想获得一些帮助以加快速度。谢谢你。
解决方案
您还可以使用apply
并设置axis = 1
为逐行。然后创建一个自定义函数传入apply
:
开始 df 的示例:
index_vec 1201 370 -1
0 [370, -1, -1] 0 0 1
1 [1201, 1201] 0 1 1
import pandas as pd
df = pd.DataFrame({'index_vec': ["[370, -1, -1]", "[1201, 1201]"], '1201': [0, 0], '370': [0, 1], '-1': [1, 1]})
def add_counts(x):
counts = pd.Series(x['index_vec'].strip("[]").split(", ")).value_counts()
x[counts.index] = x[counts.index] + counts
return x
df.apply(add_counts, axis = 1)
print(df)
输出:
index_vec 1201 370 -1
0 [370, -1, -1] 0 1 3
1 [1201, 1201] 2 1 1
推荐阅读
- c - 纯 C 中的不可变 Trie
- html - 为什么 Sublime Text 3 中的代码被涂成白色?
- c++ - 编译后如何在内存中计算 C++ 函数?
- bash - 在 gnome 终端的新选项卡中运行脚本
- python - 如何从长字符串中的一组指令中绘制路径
- javascript - 如果名称和值与输入复选框字段匹配,请选中复选框
- swift - UITableView 中的 UICollectionView 使用 Alamofire 传递数据
- php - 为什么当我单击提交按钮时 isset($_POST['like']) 不起作用?
- python - python中迭代字典的问题
- c# - 我能解释一下为什么 Quaternion.identity 有一个大写的 Q 但 transform.position 是小写的 t 吗?