在Pandas中,如何分配一个函数来处理列上的字符串?

2024-04-28 15:52:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过应用一个函数来创建/修改一列,该函数处理一列或两列中的字符串

举一个具体的例子,我有以下数据框架和函数:

def get_sign(number:str, name:str) -> str:
    """Function to apply on two columns to produce another one"""
    if number.startswith("-"):
        return "Negative-" + name[0]
    else:
        return "Positive-" + name[0]

df = pd.DataFrame({'name': ["John", "Jack", "Jeff", "Kate"], "number":["123_456", "-123", "+456", "-0"], "age": [10, 20, 30, 36]})

我正在尝试获取此数据帧:

    name    number  age sign
0   John    123_456 10  Positive-J
1   Jack    -123    20  Negative-J
2   Jeff    +456    30  Positive-J
3   Kate    -0      36  Negative-K

我尝试使用assign将序列转换为“字符串”,但出现以下错误:

df.assign(sign=lambda x:get_sign(x["number"].str, x["name"].str))
<ipython-input-64-e72c1bf8f4bf> in <lambda>(x)
      7 
      8 df = pd.DataFrame({'name': ["John", "Jack", "Jeff", "Kate"], "number":["123_456", "-123", "+456", "-0"], "age": [10, 20, 30, 36]})
----> 9 df.assign(sign=lambda x:get_sign(x["number"].str, x["name"].str))
     10 df["sign"] = pd.Series([get_sign(el) for el in df["number"]])
     11 df
 
...

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我怎样才能做到呢?谢谢


2条回答

我不知道这是否是最佳解决方案,但这可能有效

  1. 使用列作为Series
  2. 循环所有元素,压缩
  3. 将函数应用于这些元素

这导致了这样一行代码:

df["sign"] = pd.Series([get_sign(nb, name) for nb, name in zip(df["number"], df["name"])])

对于您的功能,您可以尝试:

def get_sign(number:str, name:str) -> str:
    """Function to apply on two columns to produce another one"""
    if number.startswith("-"):
        return "Negative-" + name[0]
    else:
        return "Positive-" + name[0]
out = df.assign(sign=df[['number','name']].apply(lambda x: get_sign(*x),axis=1))

请注意,您也可以对函数进行矢量化,这样您就不需要apply这是一个缓慢的过程:

import numpy as np
def get_sign_modified(dataframe,number:str, name:str) -> str:
    return np.where(dataframe[number].str.startswith("-"),
    "Negative-" + dataframe[name].str[0], "Positive-" +dataframe[name].str[0])
out = df.assign(sign=get_sign_modified(df,'number','name'))

   name   number  age        sign
0  John  123_456   10  Positive-J
1  Jack     -123   20  Negative-J
2  Jeff     +456   30  Positive-J
3  Kate       -0   36  Negative-K

相关问题 更多 >