1、按某一列分组,按时间顺序排列,然后对另外一列进行滚动求和。
c=a.copy() c.sort_values(by=["name","date"],ascending=True) #按时间顺序 c['cnt'] =c['cnt'].fillna(0) c['cnt']=c['cnt'].replace(['\\N'],[0]) #空值处理,求和要求数值型 c['cnt'] =c['cnt'].astype('float') c['sum1'] = c.groupby(['name'])['cnt'].cumsum() #按行累计求和
另一种方法,使用rolling_sum方法,但是怎么分组和按时间排序还没想好。
2、按pn_md5分组,求每个时间点之前的取值个数。
采用分组按时间排序并标上序号的方法
a = pd.read_csv('/Users/aaaa.csv',sep=',',dtype=str) b=a.copy() b.obs_date = pd.to_datetime(b.obs_date) b.obs_date=pd.to_datetime(b.date,unit='s') b['date'] = b['date'].apply(lambda x: x.value // 10**10 ) #时间转unix,rank方法只能对数值操作 b['group_sort']=b['date'].groupby(b['pn_md5']).rank(ascending=1,method='dense')
3、python读数据量太大,分块读取方法
import os import pandas as pd import numpy as np from sqlalchemy import create_engine from sqlalchemy.types import NVARCHAR,INT,DECIMAL,FLOAT import re
path = '/Users/admin/bb.csv'
#5万行一个块,然后分块处理合并,一次处理部分列 reader = pd.read_table(path,sep=',', chunksize=50000,iterator=True,encoding="utf-8") pd_merge = pd.DataFrame() for chunk in reader: #分块循环读取和处理 print(chunk) chunk_tmp1 = chunk.iloc[:,0:30] pd_merge = pd.concat([pd_merge,chunk_tmp1],axis = 0)