将 lambda 函数转换为常规函数 PYTHON df["domain_count"] = df.apply(lambda row : df['domain'].value_counts()[row['domain']], axis = 1)

问题描述 投票:0回答:2

我有当前的 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

请帮忙!预先感谢!

python pandas dataframe
2个回答
1
投票

您可以将列名称作为字符串传递,并传递要改变的数据框对象:

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())

1
投票

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))
© www.soinside.com 2019 - 2024. All rights reserved.