我有当前的 lambda 函数:
df["domain_count"] = df.apply(lambda row : df['domain'].value_counts()[row['domain']], axis = 1)
但我想将其转换为这样的常规函数
def get_domain_count()
我该怎么做?我不确定它会接受哪些参数,因为我想将其应用于数据框中的整个列? domain
列将包含重复项,我想知道某个域在我的数据框中出现了多少次。
ex start df:
|domain|
---
|target.com|
|macys.com|
|target.com|
|walmart.com|
|walmart.com|
|target.com|
ex end df:
|domain|count|
---|---|
|target.com|3
|macys.com|1
|target.com|3
|walmart.com|2
|walmart.com|2
|target.com|3
请帮忙!预先感谢!
您可以将列名称作为字符串传递,并传递要改变的数据框对象:
def countify(frame, col_name):
frame[f"{col_name}_count"] = frame.apply(lambda row: df[col_name]...)
但更好的是,您不需要申请!
df["domain"].map(df["domain"].value_counts())
将首先获取每个唯一值的计数,并将列中的每个值与其映射。所以这个函数可以变成:
def countify(frame, col_name):
frame[f"{col_name}_count"] = frame[col_name].map(frame[col_name].value_counts())
lambda 只是一个匿名函数,通常很容易使用 lambda 自己的参数列表(在本例中为
row
)将其放入函数中并返回其表达式。这个问题的挑战是 df
参数,它在模块级函数中的解析方式与 lambda 中的解析方式不同。因此,将其作为参数添加到函数中。问题是这不会是:
def get_domain_count(df, row):
return df['domain'].value_counts()[row['domain']]
如果您仍想在
.apply
操作中使用此函数,这可能会出现问题。 .apply
不知道要在前面添加那个df
参数。为了解决这个问题,您可以创建一个部分:
import functools.partial
def do_stuff(some_df):
some_df.apply(functools.partial(get_domain_count, some_df))