[toc]
为什么
数据挖掘的优化还是逃不掉的呀,毕竟写了python可是python的优势都没有用上,各种库包,没有用到.还是java那一套,感觉不对的使用体验.为了程序的运行,我还是先学一波,然后对原有的for循环和python数据结构进行修改. 目的: 提高运行速度
pandas
基础结构
DataFrame:二维数据结构:行和列
Series: 一维的 类似于DataFrame的一列
# data type of columns
df.dtypes
# indexes
df.index
# return pandas.Index
df.columns
# each row, return array[array]
df.values
# a tuple representing the dimensionality of df
df.shape
data['w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型
data.w #选择表格中的'w'列,使用点属性,返回的是Series类型
data[['w']] #选择表格中的'w'列,返回的是DataFrame类型
data[['w','z']] #选择表格中的'w'、'z'列
data.head() #返回data的前几行数据,默认为前五行,需要前十行则data.head(10)
data.tail() #返回data的后几行数据,默认为后五行,需要后十行则data.tail(10)
data.iloc[-1] #选取DataFrame最后一行,返回的是Series
data.iloc[-1:] #选取DataFrame最后一行,返回的是DataFrame
data.loc['a',['w','x']] #返回‘a’行'w'、'x'列,这种用于选取行索引列索引已知
data.iat[1,1] #选取第二行第二列,用于已知行、列位置的选取。
输入
import pandas as pd
# 使用pandas 进行操作
# 读取 文件时候,可以指定列是什么,
bought=['uid','itemid','time']
bought_history=pd.read_table('../clean/user_bought_history.txt',sep=' ',header=None,names=bought)
# 这样的bought_history 就是一个dataframe
# sep 分割列的,names设置列名的
# 或者通过一个 list[]生成
item_list=[]
bought=pd.DataFrame({'itemid':item_list}) # 这样也是指定了列名的。
# 写入到文件
bought.to_csv('文件名.格式')# txt 或者csv都行的
bought.to_csv("./matched.txt",index=False,sep=' ',header=0)#
# index:设置 索引值,默认显示输出从 1开始
# sep 设置用什么分割列,默认是','
# header=0 :设置是否出现列名,开头第一行是否有列名
sql操作
- select:
print df.loc[1:3, ['total_bill', 'tip']] print df.loc[1:3, 'tip': 'total_bill'] print df.iloc[1:3, [1, 2]] print df.iloc[1:3, 1: 3]
- where
# and print df[(df['sex'] == 'Female') & (df['total_bill'] > 20)] # or print df[(df['sex'] == 'Female') | (df['total_bill'] > 20)] # in print df[df['total_bill'].isin([21.01, 23.68, 24.59])] # not print df[-(df['sex'] == 'Male')] print df[-df['total_bill'].isin([21.01, 23.68, 24.59])] # string function print df = df[(-df['app'].isin(sys_app)) & (-df.app.str.contains('^微信\d+$'))]
类似于where语句进行查询
-
drop去重
df.drop_duplicates(subset=['sex'], keep='first', inplace=True)
subset 是设置对某列去重,但是默认是全部列,keep保留重复元素中的第一个、最后一个. inplace ,默认为False,返回一个新的dataframe;若为True,则返回去重后的原dataframe -
group分组:
df.group('列')
print df.groupby('sex').size() print df.groupby('sex').count() print df.groupby('sex')['tip'].count()
- as:重新命名即可
df.rename(columns={'total_bill': 'total', 'tip': 'pit', 'sex': 'xes'}, inplace=True)
- 排序:order
df.sort_values()
- 替换:replace 全局的修改,可以使用where选择加loc也可以:
df.replace({'sex': {'Female': 'Sansa', 'Male': 'Leone'}}, inplace=True)
df.loc[df.sex == 'Male', 'sex'] = 'Leone' - 除了上述SQL操作外,Pandas提供对每列/每一元素做自定义操作,为此而设计以下三个函数:
map(func),为Series的函数,DataFrame不能直接调用,需取列后再调用;
apply(func),对DataFrame中的某一行/列进行func操作;
applymap(func),为element-wise函数,对每一个元素做func操作
print df['tip'].map(lambda x: x - 1)
print df[['total_bill', 'tip']].apply(sum)
print df.applymap(lambda x: x.upper() if type(x) is str else x)
集合操作
这个是重点的东西
就是sql的连接 也有左右连接;
# merge默认按相同字段合并,且取两个都有的。on 用于连接的列名
new_data=pd.merge(df1,df2)
# 当左右连接字段不相同时,使用left_on,right_on
pd.merge(df1,df2,left_on="name",right_on='call_name')
# 合并后,删除重复的列
pd.merge(df1,df2,left_on='name',right_on='call_name').drop('name',axis=1) # 删除 name重复的 取出现的
# how 连接方式:‘inner’(默认);还有,‘outer’、‘left’、‘right’
# outer 外连接,取并集,并用nan填充
# left 左连接, 左侧取全部,右侧取部分”
# right 有连接,左侧取部分,右侧取全部”
注意:merge要保证列的类型一样 必要时用dtypes输出看一下,因为有时候输入为int 和str类型就不能相等,而且还不报错. 这个超级坑.
发表回复