简体   繁体   English

Pandas:如何将多个列值传递给应用 function?

[英]Pandas: how to pass multiple column values into apply function?

I have an task where I have to find a weight value in dataframe, it can be found in several columns (but not every column though)我有一个任务,我必须在 dataframe 中找到一个权重值,它可以在几列中找到(但不是每一列)

Simplified dataframe looks like this:简化后的 dataframe 如下所示:

          str1         str2
0  some string         2kg.
1      got 5kg  some string
2  some string  some string

Simplified example of how it works right now:它现在如何工作的简化示例:

import re
import pandas as pd
from pandas import Series

regex = re.compile(r'(\d+)kg')

def find_weight(row: Series) -> int | None:
    # first check in 'str1'
    result = re.search(pattern=regex, string=row['str1'])
    if result:
        return int(result.group(1))
    # if not found, check 'str2'
    result = re.search(pattern=regex, string=row['str2'])
    if result:
        return int(result.group(1))
    # if nothing found in both strings - return None
    return None


df = pd.DataFrame([['some string', '2kg.'], ['got 5kg', 'some string'], ['some string', 'some string']], columns=['str1', 'str2'])
df['weight'] = df.apply(find_weight, axis=1)
print(df)

However, in a real-life case, I have 40+ columns and weight value can be found only in 2 of them.然而,在现实生活中,我有 40 多列,而权重值只能在其中 2 列中找到。 Passing an entire row into a function every time feels wasteful.每次将一整行传递到 function 感觉很浪费。 How can I pass only arguments from several columns instead of the entire row?如何仅从几列而不是整行传递 arguments?

How to pass values only of colmns 'str1' and 'str2' into function and then apply it to every row?如何仅将 colmns 'str1' 和 'str2' 的值传递给 function 然后将其应用于每一行?

Edit: SOLUTION IS:编辑:解决方案是:

df['weight'] = df[['str1', 'str2']].apply(find_weight, axis=1)

Thanks to @HenryEcker!感谢@HenryEcker!

SOLUTION IS:解决方案是:

df['weight'] = df[['str1', 'str2']].apply(find_weight, axis=1)

Thanks to @HenryEcker!感谢@HenryEcker!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM