pandas与表处理

原创
2015/03/20 10:42
阅读数 1.4K

查询写入操作

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.'


展开阅读全文
打赏
0
8 收藏
分享
加载中
Kanonpy博主
pd.merge(left_data,right_data,on='stree_id',how='left')
表示:
左右两边表以关键词"stree_id"合并,保持左边表完整,右边表插入空置。
2015/08/29 14:46
回复
举报
Kanonpy博主
join可以加入列也可以加入行:
join(other[, on, how, lsuffix, rsuffix, sort])
由how的参数决定,
how : {‘left’, ‘right’, ‘outer’, ‘inner’}
left: use calling frame’s index
right: use input frame’s index
outer: form union of indexes
inner: use intersection of indexes
2015/03/20 22:06
回复
举报
更多评论
打赏
2 评论
8 收藏
0
分享
返回顶部
顶部