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