变慢Pandas为应用

2024-09-28 20:50:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧:

   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 

另外,中的值专栏:2007年10月,2008年和2009年分别对应变量A、B和C,如下所示:

^{pr2}$

我想使用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将其转换为某些内容。有什么提示吗?在


Tags: of数据namedfgetindexinitcount
1条回答
网友
1楼 · 发布于 2024-09-28 20:50:44

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

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

帮助你建立命名的词典

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

命名函数

^{pr2}$

然后,检查项目并复制名称相似的count item。在

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

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

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

相关问题 更多 >