gpt4 book ai didi

python - 函数内多列的 For 循环替代方案(pandas)

转载 作者:行者123 更新时间:2023-12-01 09:13:15 27 4
gpt4 key购买 nike

想象一个如下所示的函数:

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. 一列或多列(cols)
  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 |
+-----+---------+--------+--------+------+-----------+

最佳答案

我认为更好的是使用这个矢量化解决方案 - 乘以 mulmap 创建的系列 :

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

关于python - 函数内多列的 For 循环替代方案(pandas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51473799/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com