函数内多个列的For循环替代方法(pandas)

时间:2018-07-23 07:41:09

标签: python pandas function for-loop

想象一下以下功能:

def func(df, cols, col_ref):

    for c in cols:    
        df[c] = df.apply(lambda row: row[c] * ref[(ref.SOURCE == row[col_ref])].VALUE.item() ,axis=1)
    return df

调用此函数时,参数为

  1. 具有多列(df)的数据框
  2. 一个或多个列(列)
  3. 参考列,其中当前行的值指示使用了另一个数据帧(ref)的哪一行

我可以调用该函数,例如像这样:

df_new = func(df, ['col1','col2','col3'], 'ref_value')

或类似这样:

df_new2 = func(df, 'col4', 'ref_value')

是否有for循环的替代方法?我的数据框很大,并且需要一个小时才能通过for循环执行。

重要的是,该函数仍然能够处理一列以及多列作为第二个参数。

编辑

一个简单的例子:

df
+-----+------+------+------+------+-----------+
| No  | col1 | col2 | col3 | col4 | ref_value |
+-----+------+------+------+------+-----------+
| 523 |   34 |  593 |  100 |   10 | A1        |
| 523 |  100 |  100 |  100 |   43 | A1        |
| 523 | 1867 |   15 |  632 |   64 | B2        |
| 732 |  100 |  943 |  375 |  325 | B1        |
| 732 | 1000 |  656 |  235 |   63 | B1        |
+-----+------+------+------+------+-----------+

ref
+--------+-------+
| SOURCE | VALUE |
+--------+-------+
| A1     |    10 |
| B1     |  1000 |
| B2     |   100 |
+--------+-------+

输出:

df_new
+-----+---------+--------+--------+------+-----------+
| No  |  col1   |  col2  |  col3  | col4 | ref_value |
+-----+---------+--------+--------+------+-----------+
| 523 |     340 |   5930 |   1000 |   10 | A1        |
| 523 |    1000 |   1000 |   1000 |   43 | A1        |
| 523 |  186700 |   1500 |  63200 |   64 | B2        |
| 732 |  100000 | 943000 | 375000 |  325 | B1        |
| 732 | 1000000 | 656000 | 235000 |   63 | B1        |
+-----+---------+--------+--------+------+-----------+

1 个答案:

答案 0 :(得分:1)

我认为最好使用这种矢量化解决方案-将mulmap创建的Series相乘:

c = ['col1','col2','col3']
df[c] = df[c].mul(df['ref_value'].map(ref.set_index('SOURCE')['VALUE']), axis=0)
print (df)
    No     col1    col2    col3  col4 ref_value
0  523      340    5930    1000    10        A1
1  523     1000    1000    1000    43        A1
2  523   186700    1500   63200    64        B2
3  732   100000  943000  375000   325        B1
4  732  1000000  656000  235000    63        B1

详细信息

print (df['ref_value'].map(ref.set_index('SOURCE')['VALUE']))
0      10
1      10
2     100
3    1000
4    1000
Name: ref_value, dtype: int64

如果需要创建功能:

def func(df, cols, col_ref):
    df[cols] = df[cols].mul(df[col_ref].map(ref.set_index('SOURCE')['VALUE']), axis=0)
    return df

df_new = func(df, ['col1','col2','col3'], 'ref_value')
print (df_new)

    No     col1    col2    col3  col4 ref_value
0  523      340    5930    1000    10        A1
1  523     1000    1000    1000    43        A1
2  523   186700    1500   63200    64        B2
3  732   100000  943000  375000   325        B1
4  732  1000000  656000  235000    63        B1