【问题标题】:Slicing a Pandas df based on column values根据列值对 Pandas df 进行切片
【发布时间】:2019-02-26 20:49:06
【问题描述】:

您将如何执行以下操作?

  • 对于流失率=1 的客户,根据他们离开的月份计算他们最近 3 次购买的平均值。例如。 Churn_Month=3,然后平均最近 3 次购买:从 3 月、2 月和 1 月(如果有)。有时会是 2 或 1 次购买。

  • 对于流失 = 0 的客户,取他们最近 3 次购买的平均值(如果有),有时是 2 次或 1 次购买。

并将它们全部放在一个 pandas 数据框中。请参阅预期输出

可用信息

df1:您将在此处找到包含客户 ID、日期、购买 1 和购买 2 的交易。

    ID  DATE        P1  P2
0   1   2003-04-01  449 55
1   4   2003-02-01  406 213
2   3   2003-11-01  332 372
3   1   2003-03-01  61  336
4   3   2003-10-01  428 247
5   3   2003-12-01  335 339
6   3   2003-09-01  367 41
7   2   2003-01-01  11  270
8   1   2003-01-01  55  102
9   2   2003-02-01  244 500
10  1   2003-02-01  456 272
11  5   2003-03-01  240 180
12  4   2002-12-01  156 152
13  5   2003-01-01  144 185
14  4   2003-01-01  246 428
15  1   2003-05-01  492 97
16  5   2003-02-01  371 66
17  5   2003-04-01  246 428
18  5   2003-05-01  406 213

df2:在这里您可以找到客户 ID、他们是否离开公司以及离开的月份(例如 3.0 = 3 月)

    ID  Churn   Churn_Month
0   1       1   3.0
1   2       0   0.0
2   3       1   12.0
3   4       0   0.0
4   5       1   4.0

预期输出:

按 ID 的 P1 和 P2 的平均值,与 df2 信息合并。 ID 将是新的索引。

ID  P1      P2      Churn   Churn_Month
1   190.6   236.6    1         3.0
2   127.5   385      0         0.0
3   365     319.3    1         12.0
4   269.3   264.3    0         0.0
5   285.6   224.6    1         4.0

【问题讨论】:

  • 几个问题。 ID 是指客户吗? P1P2 是什么?另外,您尝试过什么/您在哪里卡住了?
  • ID 指的是客户,P1 和 P2 是购买。我不知道从哪里开始。
  • 在您的预期输出中,您有 4.0Churn_Month,但在您的 df2 中不存在。这是笔误吗?
  • 是的,这是一个错字,刚刚修正。
  • ID == 1 的结果对吗?如果平均值应该基于过去 3 个月,190.6236.6 似乎很低。 ID == 5 似乎也很低。

标签: python pandas


【解决方案1】:

这里需要一些额外的细节。首先,当Churn == 1 假设客户离开了。使用df2,您可以确定他们离开的月份并删除之后发生的任何数据。从那里开始,在分组、聚合和过滤数据方面非常简单。

# merge
df3 = df1.merge(df2)

# convert DATE to datetime
df3.DATE = pd.to_datetime(df3.DATE)

# filter rows where month of (DATE is <= Churn_Month and Churn == 1)
# or Churn == 0
df3 = df3.loc[
    ((df3.Churn == 1) & (df3.DATE.dt.month <= df3.Churn_Month)) |
    (df3.Churn == 0)
].copy()

# sort values ascending
df3.sort_values([
    'ID',
    'DATE',
    'P1',
    'P2',
    'Churn',
    'Churn_Month'
], inplace=True)

# groupby ID, Churn
# take last 3 DATEs
# merge with original to filter rows
# group on ID, Churn, and Churn_Month
# average P1 and P2
# reset_index to get columns back
# round results to 1 decimal at the end
df3.groupby([
    'ID',
    'Churn'
]).DATE.nth([
    -1, -2, -3
]).reset_index().merge(df3).groupby([
    'ID',
    'Churn',
    'Churn_Month'
])[[
    'P1',
    'P2'
]].mean().reset_index().round(1)

结果

   ID  Churn  Churn_Month     P1     P2
0   1      1          3.0  190.7  236.7
1   2      0          0.0  127.5  385.0
2   3      1         12.0  365.0  319.3
3   4      0          0.0  269.3  264.3
4   5      1          4.0  285.7  224.7

【讨论】:

    猜你喜欢
    • 2019-10-12
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2021-02-27
    • 2021-02-12
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多