将慢熊猫变为适用

时间:2014-11-09 15:57:44

标签: python pandas

我有以下数据框:

   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将其翻译成某些内容。任何提示?

1 个答案:

答案 0 :(得分:2)

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

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