【问题标题】:How to transform and create a pandas column with 0 and 1 based on specific condition如何根据特定条件转换和创建具有 0 和 1 的 pandas 列
【发布时间】:2020-11-30 17:56:41
【问题描述】:

我想创建一个列churn,如图所示。 代码应该对每一年的列Col进行分组和比较,如果在下一年找到Col的值,则分配0。

在此示例中,缺少 2017 年的第 3 行。因此分配 1。

如何在 pandas 中做到这一点?

State ID    Col   Year  cost  Churn
CT    123   M     2016  10    0
CT    123   C     2016  15    0
CT    123   A     2016  10    1
CT    123   C     2016  20    0
CT    123   M     2017  10    0
CT    123   C     2017  15    0

【问题讨论】:

  • 如果客户离开然后返回怎么办?即 A 出现在 2015 年,从 2016 年消失,然后在 2017 年再次出现?
  • 如果 A 在 2016 年消失,那么在 2015 年分配 1,因为他们流失了。如果他们在 2017 年回来,那么分配 0,因为那是他们没有流失的新客户

标签: python pandas pandas-groupby churn


【解决方案1】:

首先用Series.reindexMultiIndex.from_product添加前4列的所有缺失组合,然后每前3列移动DataFrameGroupBy.shift,最后使用DataFrame.merge作为原始顺序并删除所有添加的行(如果没有参数@ 987654329@ 它使用两个 DataFrame 中相同的所有列):

s = df.assign(Churn=0).set_index(['State','ID','Col','Year'])['Churn']
df1 = df.merge(s.reindex(pd.MultiIndex.from_product(s.index.levels), fill_value=1)
                .groupby(level=[0,1,2])
                .shift(-1, fill_value=0)
                .reset_index())
print (df1)
  State   ID Col  Year  Churn
0    CT  123   M  2016      0
1    CT  123   C  2016      0
2    CT  123   A  2016      1
3    CT  123   M  2017      0
4    CT  123   C  2017      0

【讨论】:

  • 有没有办法在没有索引的情况下做到这一点,我说cannot handle a non-unique multi-index 时出错,也不明白为什么要移动-1。我正在尝试在每年比较列和列Col 的组合来决定流失率
  • @Priyank - 这意味着有重复,比如样本数据中的第一个CM,如何处理这些数据?
  • 我知道有重复但不知道为什么这在计算 churn 指标时很重要。如果一个组合在一年内重复,那很好,如果它在明年重复,则为 0,如果没有,则为上一年的 1
  • @Priyank - 是的,同意。输入数据中只有['State','ID','Col','Year'] 列?如果是,则将s = df.assign(Churn=0).set_index(['State','ID','Col','Year'])['Churn'] 更改为s = df.drop_duplicates().assign(Churn=0).set_index(['State','ID','Col','Year'])['Churn']
  • 实际上,数据中还有其他列是相关的,并且在同一年具有不同的值。我试过drop_duplicates 给了我同样的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2019-04-04
相关资源
最近更新 更多