我有以下数据框:
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将其翻译成某些内容。任何提示?
答案 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