我有以下数据框:例如:
TXN_ID TXN_DATE TXN_TYPE
8C083F30C0674A72 01/01/2013 00:00 A
B610D7D4E2D14513 01/01/2013 00:00 B
698C5DD423AC42D6 02/01/2013 00:00 C
37E2B21583F949CA 12/01/2013 00:00 A
9FE25A547F964E93 13/01/2013 00:00 B
F6C14D987D584E53 14/01/2013 00:00 A
对于每一行,我想添加3个功能 - 在同一天,过去3天内计算不同的TXN_TYPE&在过去一周。 所以数据框看起来像:
TXN_ID TXN_DATE TXN_TYPE Distinct_Type_1Day Distinct_Type_3Day Distinct_Type_7Day
8C083F30C0674A72 01/01/2013 00:00 A 2 2 2
B610D7D4E2D14513 01/01/2013 00:00 B 2 2 2
698C5DD423AC42D6 02/01/2013 00:00 C 1 3 3
37E2B21583F949CA 12/01/2013 00:00 A 1 1 1
9FE25A547F964E93 13/01/2013 00:00 B 1 2 2
F6C14D987D584E53 14/01/2013 00:00 A 1 2 2
什么是最好的&有效的方法吗?
答案 0 :(得分:0)
这将完成工作,但我使用了我不喜欢的apply
。
def comp_dates(x):
d = 'TXN_DATE'
date = x[d]
d1 = date - pd.offsets.Day(1)
d3 = date - pd.offsets.Day(3)
d7 = date - pd.offsets.Day(7)
cond0 = df[d] <= date
cond1 = df[d] > d1
cond3 = df[d] > d3
cond7 = df[d] > d7
s = pd.Series([
len(df[cond0 & cond1].TXN_TYPE.unique()),
len(df[cond0 & cond3].TXN_TYPE.unique()),
len(df[cond0 & cond7].TXN_TYPE.unique()),
], ['Distinct_Type_1Day', 'Distinct_Type_3Day', 'Distinct_Type_7Day'])
return s
pd.concat([df, df.apply(comp_dates, axis=1)], axis=1)
我使用此代码创建数据框
text = """TXN_ID TXN_DATE TXN_TYPE
8C083F30C0674A72 01/01/2013 00:00 A
B610D7D4E2D14513 01/01/2013 00:00 B
698C5DD423AC42D6 01/02/2013 00:00 C
37E2B21583F949CA 01/12/2013 00:00 A
9FE25A547F964E93 01/13/2013 00:00 B
F6C14D987D584E53 01/14/2013 00:00 A"""
df = pd.read_csv(StringIO(text), delimiter='\s{2,}', parse_dates=[1], engine='python')