从pandas DataFrame创建一个布尔列,其中True表示在列中存在字符串。

2024-05-18 21:42:02 发布

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

在过去的三个多月里,我一直在使用熊猫进行数据分析(并自学熊猫)

我有一个熊猫数据帧,如下所示:

df

client_id    opp_id    opportunity_status
4312         80465     Closed Won
4312         34508     Closed Won
4312         56478     Pending
3456         29930     Closed Lost
3456         70331     Pending
3456         65203     Closed Won
5203         29930     Closed Lost
5203         70331     Pending
5203         65203     Closed Lost
5203         65203     Closed Lost

我想高效地创建第二个数据帧:

has_cw

client_id    has_closed_won_opp
4312         True
3456         True
5203         False

其中has_cw.client_id是来自df.client_id的唯一值,has_cw.has_closed_won_opp是布尔值列表,其中True表示df中至少有一个“已结束赢得”机会

我很难想出一个好的方法来做这件事,除了以这种方式低效地循环通过df

has_cw = dict()
for id in df.client_id.unique():
    has_cw_bool = 'Closed Won' is in list(df[df['client_id'] == id]['opportunity_status'])
    has_cw[id] = has_cw_bool

然后将has_cwdict转换为数据帧

我怎样才能有效地做到这一点?提前谢谢


Tags: 数据clientidtruedfstatushasclosed
1条回答
网友
1楼 · 发布于 2024-05-18 21:42:02

您可以使用groupby.agg,为每个客户机id检查机会状态是否等于已关闭赢的

df.groupby('client_id', as_index=False).opportunity_status.agg(lambda x: x.eq('Closed Won').any())

# client_id   opportunity_status
#0     3456                 True
#1     4312                 True
#2     5203                False

或更快的版本:

df.opportunity_status.eq('Closed Won').groupby(df.client_id).any().reset_index()

#   client_id   opportunity_status
#0       3456                True
#1       4312                True
#2       5203               False

%timeit df.groupby('client_id', as_index=False).opportunity_status.agg(lambda x: x.eq('Closed Won').any())
# 100 loops, best of 3: 4.84 ms per loop

%timeit df.opportunity_status.eq('Closed Won').groupby(df.client_id).any().reset_index()
# 1000 loops, best of 3: 2.06 ms per loop

相关问题 更多 >

    热门问题