有人能帮我吗?
我需要处理以下数据帧:
在此处输入图像描述
SEGSTART列表示客户端调用的确切日期和时间。如果此客户端在过去7天内调用了两次或两次以上,则必须将其视为RECALL_7d(值=1(。否则,RECALL_7d值必须设置为0。
然而,RECALL_7d系列包含一些错误,因为有时它将客户端视为召回,有时则不然。我需要解决这个问题,我做到了:
-
首先,我创建了一个名为days的列,以计算第i行和第i+1:行的segstart之间的差异
df[days']=df。SEGSTART.diff((.apply(lambda x:x/np.timedelta64(1,'D'((.fillna(0(.astype('t64'(
上面的代码向我返回了以下数据帧。正如可以看到的那样;错误";因为索引6的天数值应该是0。所以,为了解决这个问题,我试着这样做:
size = len(df['Client_id'])
df['days'] = np.nan
for i in range (size-1):
if df.loc[i+1, 'Client_id'] == df.loc[i, 'Client_id']:
df.loc[i+1, 'days'] = df.loc[:i+1, 'SEGSTART'].diff().apply(lambda x: x/np.timedelta64(1, 'D')).fillna(0).astype('int64')
else:
df.loc[i+1, 'days'] = 0
所以我得到了这个错误:
ValueError Traceback(最近一次调用最后一次(在里面5.6如果df.loc[i+1,'Client_id']==df.loc[i,'Client_i']:---->7 df.loc[i+1,'days']=df.loc[:i+1,'SEGSTART'].diff((.apply(lambda x:x/np.timedelta64(1,'D'((.fillna(0(.astype('t64'(8.9其他:
setitem中的~\anaconda3\lib\site packages\pandas\core\indexing.py(self,key,value(668669 iloc=self-if self-name==";iloc";其他self.obj.loc-->670 iloc_setitem_with_indexer(索引器,值(671672 def_validate_key(self,key,axis:int(:
_setitem_with_indexer中的~\anaconda3\lib\site packages\pandas\core\indexing.py(self,indexer,value(16401641如果不稳定(值,ABCSeries(:->1642值=自身_align_series(索引器,值(16431644 info_idx=索引器[ifo_axis]
_align_series中的~\anaconda3\lib\site packages\pandas\core\indexing.py(self、indexer、ser、multiindex_indexer(1952年返回ser.rendex(ax(_values1953->1954年提升ValueError("与系列不兼容的索引器"(19551956 def_align_frame(self,indexer,df:ABCDAFrame(:
ValueError:索引器与系列不兼容
在此处输入图像描述
在DATA
列上使用pd.to_datetime
可以处理和比较日期和时间增量。然后,使用groupby('Client_id')
并对DATA
值进行排序(如果尚未排序(,这将简化每个单独客户端的调用计算。使用diff
,将其与7天的时间段(pd.Timedelta(7, 'D')
(进行比较,并定义这是否被视为召回。使用pd.concat
和sort_index()
重建原始数据帧。
import pandas as pd
df = pd.read_csv('sample.csv')
df['DATA'] = pd.to_datetime(df['DATA'])
full_df = []
for n, g in df.groupby('Client_id'):
g['DATA'] = g.DATA.sort_values()
g['recall_7d'] = (g.DATA.diff() < pd.Timedelta(7, 'D')).astype(int)
full_df.append(g)
df_out = pd.concat(full_df).sort_index()
print(df_out)
df_out的输出
Client_id SEGSTART DATA recall_7d
0 38034991852 2021-01-08 20:15:05.000 2021-01-08 0
1 38034991852 2021-01-27 19:57:49.000 2021-01-27 0
2 38034991852 2021-01-27 19:37:33.000 2021-01-27 1
3 38034991852 2021-01-27 22:08:58.000 2021-01-27 1
4 38034991852 2021-02-01 10:45:00.000 2021-02-01 1
5 38034991852 2021-02-01 10:55:53.000 2021-02-01 1
6 11111111111 2021-02-03 10:15:05.000 2021-02-03 0
7 11111111111 2021-02-06 20:23:07.000 2021-02-06 1
8 11111111111 2021-02-07 08:54:05.000 2021-02-07 1
9 11111111111 2021-02-07 20:17:05.000 2021-02-07 1
10 11111111111 2021-02-13 16:25:00.000 2021-02-13 1
11 11111111111 2021-02-28 17:19:23.000 2021-02-28 0