查询写入操作 pandas可以类似sql一样有强大的查询功能,而且写法简单: printtips[['total_bill','tip','smoker','time']]#显示'total_bill
查询写入操作
pandas可以类似sql一样有强大的查询功能,而且写法简单:
print tips[['total_bill', 'tip', 'smoker', 'time']]#显示'total_bill', 'tip', 'smoker', 'time'列,功能类似于sql中的select命令print tips[tips['time'] == 'Dinner']#显示time列中等于Dinner的数据,功能类似于sql中的Where命令print tips[(tips['size'] >= 5) | (tips['total_bill'] > 45)]print tips[(tips['time'] == 'Dinner') & (tips['tip'] > 5.00)]# |功能类似于sql中的or命令, &功能类似于sql中的and命令#index和label查询df.iloc[i:j,k:p]#iloc操作index,输出第i行到第j行和第k列和第p列中的数值df.loc['20130102':'20130104',['A','B']]#loc操作label,输出行为'20130102':'20130104',列为'A','B'df.at[dates[0],'A']#返回特定行label和列label的数值#map函数操作df['Oid'] = df['Name'].map(lambda x: int(x.split(' - ')[0]))#删除列del df['smoker']#增加列df['smoker'] = np.nan#删除行df = df.drop([i for i in range(1,100)],axis=0)#删除100行#增加行df = df.append(pd.DataFrame(index=[i for i in range(100,200)],columns=df.columns),ignore_index=True)#增加一百行
使用pandas写一个将一维关系表写成展二维开式关系表,代码如下:
def one2two(filepath,col_value): ''' 该关系表为一个Oid字段和一个Did的字段,两个字段对应一个数字co_value,该函数将Oid和Did 字段中数值转换成一个以Oid为列,Did为行的二维数据表。 ''' df = pd.read_csv(filepath) newdf = pd.DataFrame(columns=df['Oid'].unique(),index=df['Did'].unique()) time = len(newdf.index) for i in newdf.index: for c in newdf.columns: #通过查询获得Oid和Did对应的值 value = df[df.Did==c][df[df.Did==c].Oid==i] newdf[c][i] = value[col_value] time=time-1 print 'Ater %d the app will leave.'%time print 'Ready to write.' newdf.to_csv(col_value+'.csv') print 'Finsh write, the %s.cvs was generated'%col_value
pandas除了查询不错在bigfile处理也相当可观,如下面从一个大文件中提取要素保存的函数:
def save(pathfile,outPath): reader = pd.read_csv(pathfile,iterator=True)#使用iterator,使pandas可以分开读取文件 loop = True chunkSize = 1000000 chunks = [] while loop: try: #划分成chunksize行大小的块进行读取 df = reader.get_chunk(chunkSize) chunks.append(df) except StopIteration: loop = False print 'Iteration is stopped.' try: #将块连接起来,这里用了一个try,因为不知道怎么的总是发生内存错误,如果不用try..finally后面 #代码总是无法运行,但不知道加了try..finally对数据是否有影响? df = pd.concat(chunks, ignore_index=True) finally: df = df[['Name','Total_length','Total_time']] #提出Name字段中数值中' - '之前的放入Oid中 df['Oid'] = df['Name'].map(lambda x: int(x.split(' - ')[0])) df['Did'] = df['Name'].map(lambda x: int(x.split(' - ')[1])) del df['Name'] df.to_csv(outPath) print 'Finsh.'