我正在加载带有pandas的CSV文件。它有三列:一列包含日期和时间,一列包含用户ID,另一列包含“campaignID”。 示例行:
date user_id campaign_id
2018-01-10 0:21:09 151312395 GOOGLE
2018-01-10 0:21:19 151312395 GOOGLE
2018-01-10 0:21:32 151312395 GOOGLE
我想按用户ID对数据进行分组,然后针对每个用户ID组按时间和广告系列ID进行分组,它应如下所示。
user_id date ad_campaign
151312395 2018-01-10 0:21:09 GOOGLE
2018-01-10 0:21:19 GOOGLE
2018-01-10 0:21:32 GOOGLE
这是我迄今为止所做的: 将pandas导入为pd 导入numpy为np 导入日期时间
def dateparse(time_in_secs):
return datetime.datetime.fromtimestamp(float(time_in_secs))
columnnames = ['date','user_id', 'ad_campaign']
columnnames, sep='\t' ,usecols=[0,1,3],index_col = 'date')
df=pd.read_csv(r'C:\Users\L\Desktop\Data.csv' ,
sep='\t',names = columnnames, usecols=[0,1,3],
parse_dates=True,date_parser=dateparse)
df.date = pd.to_datetime(df.date)
df = df.sort_values(by = 'date')
g = df.groupby('user_id')['ad_campaign']
print(g)
这给出了以下输出:
<pandas.core.groupby.SeriesGroupBy object at 0x04EF26F0>
[Finished in 0.6s]
为什么打印不提供排序列?
答案 0 :(得分:2)
首先,如果您正在执行import numba as nb
@nb.njit(fastmath=True)
def get_threshold(abs_cosine,threshold):
idx=0
sim_vec=np.empty((abs_cosine.shape[0]*abs_cosine.shape[1],2),dtype=np.uint32)
for m in range(abs_cosine.shape[0]):
for n in range(abs_cosine.shape[1]):
# exclude diagonal cells
if m != n and abs_cosine[m,n] >= threshold:
sim_vec[idx,0]=m
sim_vec[idx,1]=n
idx+=1
return sim_vec[0:idx,:]
,则无需明确对列进行排序。
你可以这样做:
方法1:
groupby
方法2:
df.date = pd.to_datetime(df.date)
g = df.groupby(['user_id','date'])['ad_campaign']
print(g.first())
答案 1 :(得分:0)
您可以尝试df.set_index(['user_id', 'date'])
。