Pandas Dataframe更快的方法

时间:2018-01-08 13:39:54

标签: python pandas dataframe

我的代码部分需要从一个数据帧中获取值,然后将其应用于另一个数据帧。因此,例如,假设1个数据框是学生数据框的分数,第2个是学生数据框的组合。我想通过每个组合_DF,获得学生分数,然后将它们总结为该行。

print scores_DF

Name     Value
Dennis   39.66
James    45.38
Leo      40.63
Joe      20.10
etc...


print combination_DF

name1     name2     name3  
Dennis    James     Leo    
Leo       Joe       Dennis  

现在我的程序循环遍历每个组合_DF,找到每个名称的分数,并添加一个列,其中包含每个组合的总分,这实际上减慢了我的程序因为我使用了数千个条目。所以它看起来像这样......

    for index,row in combination_df.iterrows():
        value0 = scores_df[scores_df['Name'] == row[0]]
        value1 = scores_df[scores_df['Name'] == row[1]]
        value3 = scores_df[scores_df['Name'] == row[2]]
        total_score =  value0['Value'].values + value1['Value'].values+ value2['Value'].values

我是Pandas的新手,当时这是我知道的唯一方式,但是随着我的程序的发展,这个代码区域需要更快地工作,谢谢。

2 个答案:

答案 0 :(得分:0)

我认为您首先需要groupby并汇总sum,然后sums = scores_DF.groupby('Name')['Value'].sum() combination_DF['sum'] = combination_DF.replace(s).sum(axis=1) 汇总:

combination_DF['sum'] = combination_DF.stack().map(s).unstack().sum(axis=1)

print (combination_DF)
    name1  name2   name3     sum
0  Dennis  James     Leo  125.67
1     Leo    Joe  Dennis  100.39

replace + map +交互 stack

print (combination_DF.replace(s))
   name1  name2  name3
0  39.66  45.38  40.63
1  40.63  20.10  39.66

详情:

data

答案 1 :(得分:0)

你可能会有点发烧友。首先,让我们创建一个函数

f = lambda x: scores_DF.ix[x]["Value"]

用f测试(" Dennis")......

不需要iterrows:

combintation.apply(f, axis=1).sum(axis=1)

应该有效 更多硬核用户插入f direct作为apply函数的参数...