首页 > 解决方案 > 如何避免此熊猫数据帧处理的迭代

问题描述

在不使用 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() 处理大型数据帧非常慢。我想获得一些帮助以加快速度。谢谢你。

标签: pythonpandasdataframe

解决方案


您还可以使用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

推荐阅读