Python 在客户数据中查找首次购买的月份

Python 在客户数据中查找首次购买的月份,python,pandas,Python,Pandas,我创建了一个透视表,显示每个客户每月的交易数量 打印起来非常凌乱,因此这里有一个屏幕截图: 您可以看到,对于customer\u id1(红色),他们于2019年8月首次购买(绿色)。这意味着客户已经12个月大了。我从最近一个月的倒数中得到了数字12 如何以编程方式为所有客户提取此信息 我想增加一个名为任期的专栏,计算客户的月龄 我想我应该尝试向后/向前数列数,直到找到第一个非“nan”数 但我不知道该怎么做。我在这里尝试了一些类似问题的建议。转换数据帧并对每个客户使用Series.first

我创建了一个透视表,显示每个客户每月的交易数量

打印起来非常凌乱,因此这里有一个屏幕截图:

您可以看到,对于
customer\u id
1(红色),他们于2019年8月首次购买(绿色)。这意味着客户已经12个月大了。我从最近一个月的倒数中得到了数字12

如何以编程方式为所有客户提取此信息

我想增加一个名为
任期
的专栏,计算客户的月龄

我想我应该尝试向后/向前数列数,直到找到第一个非“nan”数

但我不知道该怎么做。我在这里尝试了一些类似问题的建议。转换数据帧并对每个客户使用
Series.first\u valid\u index()
,或者混合使用
df.isnull()
idxmax()
,但我无法让它工作

谢谢你的帮助。我相信这很容易解决,但我迷路了

我的示例df:


df.to_dict()


{'customer_id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10},
 'Jan 19': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'Feb 19': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: 1.0,
  9: nan},
 'Mar 19': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'Apr 19': {0: nan,
  1: 1.0,
  2: 1.0,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'May 19': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: 1.0,
  7: nan,
  8: nan,
  9: nan},
 'Jun 19': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'Jul 19': {0: nan,
  1: nan,
  2: nan,
  3: 1.0,
  4: nan,
  5: nan,
  6: 2.0,
  7: nan,
  8: nan,
  9: 2.0},
 'Aug 19': {0: 1.0,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: 1.0,
  9: nan},
 'Sep 19': {0: 2.0,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'Oct 19': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: 1.0,
  6: nan,
  7: nan,
  8: 1.0,
  9: nan},
 'Nov 19': {0: 1.0,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: 1.0,
  8: nan,
  9: nan},
 'Dec 19': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: 1.0,
  7: nan,
  8: nan,
  9: nan},
 'Jan 20': {0: nan,
  1: nan,
  2: nan,
  3: 1.0,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'Feb 20': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'Mar 20': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'Apr 20': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'May 20': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'Jun 20': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'Jul 20': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan},
 'Aug 20': {0: nan,
  1: nan,
  2: nan,
  3: nan,
  4: 1.0,
  5: nan,
  6: nan,
  7: nan,
  8: nan,
  9: nan}}

其思想是将列转换为数字的月份周期,并使用测试第一个非缺失值,如果只有缺失值行,则添加以避免匹配ST列。最后从索引的右侧VAL值中减去:



d
是问题中的词典:

from itertools import count

df = pd.DataFrame(d).set_index('customer_id')
df['tenure'] = df.rename(columns=lambda x, c=count(len(df.columns)-1, -1): next(c)).idxmin(axis=1)
print(df)
印刷品:

             Jan 19  Feb 19  Mar 19  Apr 19  May 19  Jun 19  Jul 19  Aug 19  Sep 19  Oct 19  Nov 19  Dec 19  Jan 20  Feb 20  Mar 20  Apr 20  May 20  Jun 20  Jul 20  Aug 20  tenure
customer_id                                                                                                                                                                        
1               NaN     NaN     NaN     NaN     NaN     NaN     NaN     1.0     2.0     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      12
2               NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      16
3               NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      16
4               NaN     NaN     NaN     NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN      13
5               NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     1.0       0
6               NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      10
7               NaN     NaN     NaN     NaN     1.0     NaN     2.0     NaN     NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      15
8               NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN       9
9               NaN     1.0     NaN     NaN     NaN     NaN     NaN     1.0     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      18
10              NaN     NaN     NaN     NaN     NaN     NaN     2.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      13
from itertools import count

df = pd.DataFrame(d).set_index('customer_id')
df['tenure'] = df.rename(columns=lambda x, c=count(len(df.columns)-1, -1): next(c)).idxmin(axis=1)
print(df)
             Jan 19  Feb 19  Mar 19  Apr 19  May 19  Jun 19  Jul 19  Aug 19  Sep 19  Oct 19  Nov 19  Dec 19  Jan 20  Feb 20  Mar 20  Apr 20  May 20  Jun 20  Jul 20  Aug 20  tenure
customer_id                                                                                                                                                                        
1               NaN     NaN     NaN     NaN     NaN     NaN     NaN     1.0     2.0     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      12
2               NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      16
3               NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      16
4               NaN     NaN     NaN     NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN      13
5               NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     1.0       0
6               NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      10
7               NaN     NaN     NaN     NaN     1.0     NaN     2.0     NaN     NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      15
8               NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN       9
9               NaN     1.0     NaN     NaN     NaN     NaN     NaN     1.0     NaN     1.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      18
10              NaN     NaN     NaN     NaN     NaN     NaN     2.0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      13