gpt4 book ai didi

python - 将慢速 pandas iterrow 转换为 apply

转载 作者:行者123 更新时间:2023-12-01 04:58:28 24 4
gpt4 key购买 nike

我有以下数据框:

   VALUE      COUNT  RECL_2007  RECL_2008  RECL_2009  A_A  A_B  A_C  B_A  B_B  \
0 189 149.5872 503 503 500 0 0 0 0 0
1 209 1939.6160 503 503 503 0 0 0 0 0
2 499 617.4784 503 500 503 0 0 0 0 0
3 585 73.0688 503 503 503 0 0 0 0 0
4 611 133.9072 503 500 503 0 0 0 0 0
5 645 278.7904 503 503 503 0 0 0 0 0
6 659 138.2976 500 503 503 0 0 0 0 0
7 719 769.5744 503 503 502 0 0 0 0 0

B_C C_A C_B C_C
0 0 0 0 0
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0
5 0 0 0 0
6 0 0 0 0
7 0 0 0 0

此外,RECL_2007、RECL_2008 和 RECL_2009 列中的值对应于变量 A、B 和 C,如下所示:

 A = 500, B=502, C=503.

我想使用 COUNT 列中的值填充 A_A...C_C 列,以便 RECL_2007 值给出列名称的第一部分,RECL_2009 给出列名称的第二部分。

即,如果 RECL_2007 == 503 且 RECL_2009 == 500,则该列为 C_A,其值应更新为该行的 COUNT 列中的值。

目前我正在使用 iterrows 迭代 pandas 数据框:

for index, row in df.iterrows():    
init = OPP_LU[row[name_init]] # Get first part of column name
finl = OPP_LU[row[name_finl]] # Get second part of column name
col_name = init+'_'+finl
df.loc[index,col_name] = row['COUNT']

这很慢,但我不确定如何使用 apply 将其转换为某些内容。有什么提示吗?

最佳答案

有两种方法可以做到这一点。

  • 您可以使用apply函数,但您需要在这里做额外的工作(只是为了简化工作)。

帮助您建立命名的字典

d={'500':'A','502':'B','503':'C'}

命名函数

name= lambda x: "{0}_{1}".format(d[str(int(x['RECL_2007']))],d[str(int(x['RECL_2009']))])

然后,遍历项目并复制计数名称相似的项目。

   df["C_A"] = df.apply(lambda x: x['COUNT'] if name(x)=='C_A' else 0, axis=1)

另一种更简单的解决方案是过滤您拥有的数据,然后复制计数项

df.loc[(df['RECL_2007']==503) & (df['RECL_2009']==503), 'C_C']= df['COUNT']

代码看起来像,这只是一个简单的示例,您需要处理其他场景。

data= """VALUE,COUNT,RECL_2007,RECL_2008,RECL_2009\n189,149.5872,503,503,500\n209,939.6160,503,503,503\n499,617.4784,503,500,503\n585,73.0688,503,503,503\n611,133.9072,503,500,503\n645,278.7904,503,503,503\n659,138.2976,500,503,503\n719,769.5744,503,503,502"""

import pandas as pd

from io import StringIO

df= pd.read_csv(StringIO(data.decode('UTF-8')),sep=',' )

#First approach:
d={'500':'A','502':'B','503':'C'}
name= lambda x: "{0}_{1}".format(d[str(int(x['RECL_2007']))],d[str(int(x['RECL_2009']))])
df['C_C']=[0]*len(df.VALUE)

df["C_A"] = df.apply(lambda x: x['COUNT'] if name(x)=='C_A' else 0, axis=1)

#Second approach:
df.loc[(df['RECL_2007']==503) & (df['RECL_2009']==503), 'C_C']= df['COUNT']

print df

输出:

   VALUE     COUNT  RECL_2007  RECL_2008  RECL_2009       C_C       C_A
0 189 149.5872 503 503 500 0.0000 149.5872
1 209 939.6160 503 503 503 939.6160 0.0000
2 499 617.4784 503 500 503 617.4784 0.0000
3 585 73.0688 503 503 503 73.0688 0.0000
4 611 133.9072 503 500 503 133.9072 0.0000
5 645 278.7904 503 503 503 278.7904 0.0000
6 659 138.2976 500 503 503 0.0000 0.0000
7 719 769.5744 503 503 502 0.0000 0.0000

关于python - 将慢速 pandas iterrow 转换为 apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com