python - 将变量传递给 pandas 中的 apply()

标签 python pandas apply

我在获取将函数应用于数据框的正确语法时遇到了问题。我正在尝试通过连接其他两列中的字符串并传入分隔符来在数据框中创建一个新列。我得到错误

TypeError: ("apply_join() missing 1 required positional argument: 'sep'", 'occurred at index cases')

如果我将 sep 添加到 apply_join() 函数调用,那也会失败:

  File "unite.py", line 37, in unite
    tibble_extra = df[cols].apply(apply_join, sep)
NameError: name 'sep' is not defined
import pandas as pd
from io import StringIO

tibble3_csv = """country,year,cases,population
Afghanistan,1999,745,19987071
Afghanistan,2000,2666,20595360
Brazil,1999,37737,172006362
Brazil,2000,80488,174504898
China,1999,212258,1272915272
China,2000,213766,1280428583"""
with StringIO(tibble3_csv) as fp:
    tibble3 = pd.read_csv(fp)
print(tibble3)

def str_join_elements(x, sep=""):
    assert type(sep) is str
    return sep.join((str(xi) for xi in x))

def unite(df, cols, new_var, combine=str_join_elements):
    def apply_join(x, sep):
        joinstr = str_join(x, sep)
        return pd.Series({new_var[i]:s for i, s in enumerate(joinstr)})
  
    fixed_vars = df.columns.difference(cols)
    tibble = df[fixed_vars].copy()
    tibble_extra = df[cols].apply(apply_join)
  
    return pd.concat([tibble, tibble_extra], axis=1) 
table3_again = unite(tibble3, ['cases', 'population'], 'rate', combine=lambda x: str_join_elements(x, "/"))
print(table3_again)

最佳答案

当你有多个参数时使用lambda,即

df[cols].apply(lambda x: apply_join(x,sep),axis=1)

或者在args参数的帮助下传递参数即

 df[cols].apply(apply_join,args=[sep],axis=1)

关于python - 将变量传递给 pandas 中的 apply(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46519139/

相关文章:

python - 使用任务创建 celery 管道,仅当前一个任务中的一定数量的项目堆叠时才运行

python - 提取pandas数据框中某些字符后的数字

python - 在 Python 中解码一列 Base64 字符串

python - Python 中的原始 CGI

python - Swig Python 不包装方法

python - 将包含日期信息作为对象的列转换为日期时间时出现问题

save - 保存和应用按钮之间的区别?

python - Pandas 方法在整个 DataFrame 上应用函数

r - 应用函数来组合列

c++ - 使用SWIG将自定义C++异常动态地重新抛出为Python异常