想象一下以下功能:
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_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 |
+-----+---------+--------+--------+------+-----------+
答案 0 :(得分:1)
我认为最好使用这种矢量化解决方案-将mul
与map
创建的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