【发布时间】:2018-12-30 14:39:43
【问题描述】:
想象一个像下面这样的函数:
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
调用该函数时,参数为
- 具有多列 (df) 的数据框
- 一列或多列(列)
- 参考列,其中当前行的值指示使用了其他数据帧 (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 |
+-----+---------+--------+--------+------+-----------+
【问题讨论】:
-
首先,函数是做什么的?
-
我添加了更多代码。认为没有它可能会更容易。我只是执行一个简单的数学运算。
-
@MaMo - 可以添加一些示例数据吗?似乎这里应该有一些
join。 -
我添加了一个非常简单的示例。我想再提一次,我的编码已经有效,但由于 for 循环导致效率不高
标签: python pandas function for-loop