数据准备
df = pd.DataFrame({"id": [1001, 1002, 1003, 1004, 1005, 1006],
"date": pd.date_range('20130102', periods=6),
"city": ['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '],
"age": [23, 44, 54, 32, 34, 32],
"category": ['100-A', '100-B', '110-A', '110-C', '210-A', '130-F'],
"price": [1200, np.nan, 2133, 5433, np.nan, 4432]},
columns=['id', 'date', 'city', 'category', 'age', 'price'])
- 输出结果
id date city category age price
0 1001 2013-01-02 Beijing 100-A 23 1200.0
1 1002 2013-01-03 SH 100-B 44 NaN
2 1003 2013-01-04 guangzhou 110-A 54 2133.0
3 1004 2013-01-05 Shenzhen 110-C 32 5433.0
4 1005 2013-01-06 shanghai 210-A 34 NaN
5 1006 2013-01-07 BEIJING 130-F 32 4432.0
DataFrame对象说明
- 表头是
DataFrame
对象的一个使用,可以统一操作
df.id + 1 # 将id这一列的所有数据都加一,df.if返回的是一个Series的对象
访问列数据
df['date'] # 返回的是一个Series对象
df.date # 返回date列的Series对象
df.loc[:,['date','id']] # 返回id,和date列的DateFrame对象
df.loc[:,['date']] # 返回date列的DateFrame对象
访问行的数据
df.iloc[-1] # 获取最后一行数据,返回的是一个Series对象
list(df.iloc[-1]) # 可以直接将获取到的数据转换为列表
df.iloc[1:3] # 返回的是一个 DataFrame 对象, 和df的类型是一样的,返回第一二行的数据
df[1:3] # 和上的返回结果一样,返回第一二行的数据
df.head() #默认前10行数据
df.tail() #默认后10 行数据
df.head(1) # 获取第一行的数据, 返回DateFrame对象
其他操作
- 用数字0填充空值
df.fillna(value=0) # 替换所有的的 空值 为 0
df.price.fillna(value=0) # 替换prince列中 空值 为 0
- 求一列的平均值
df.age.mean()
- 大小写转换
df['city'].str.lower()
- 更改数据格式
df.price.astype('int') # 将 price 列的数据转化为整型(如果可以转化)
- 重命名列名称
de.rename(columns={'category':'category-size'})
- 删除重复值
df['city'].drop_duplicates() # 删除后出现的重复值
df['city'].drop_duplicates('last') # 删除先出现的重复的值
- 替换数据
df.city.replace('sh', 'shanghai) # 将 sh 替换为 shanghai
df.replace({'city':{'sh':'shanghai','beijing':'bj'}}) # 将 sh 和 beijing 同时替换
# 还有很多种替换, 用户的时候查询帮助信息
- 数据表合并
df1=pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006,1007,1008],
"gender":['male','female','male','female','male','female','male','female'],
"pay":['Y','N','Y','Y','N','Y','N','Y',],
"m-point":[10,12,20,40,40,40,30,20]})
df_inner=pd.merge(df,df1,how='inner') # 匹配合并,交集
df_left=pd.merge(df,df1,how='left') #
df_right=pd.merge(df,df1,how='right')
df_outer=pd.merge(df,df1,how='outer') #并集
- 设置索引列
df.set_index('id')
- 按照指定列排序
df.sort_values(by=['age']) # 按照年龄排序
df_inner.sort_index() # 按照索引列排序
- 添加新的字段
如果prince列的值>3000,group列显示high,否则显示low
df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')
- 对复合对个条件的数据进行分组标记
df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1
- 对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size
pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size']))
将完成分裂后的数据表和原df_inner数据表进行匹配
df_inner=pd.merge(df_inner,split,right_index=True, left_index=True)
数据提取
主要用到的三个函数:loc,iloc和ix,loc函数按标签值(索引值)进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取。 ix优先按照标签提取,按标签提取不等同于切片
- 提取四日之前的数据
df_2 = df.set_index('date') # 将日期列设置为索引
df_2[:'2013-1-04']
- 获取区域数据
df.iloc[:2,:3] # 获取 前两行 的 前三列 数据
# 获取指定列和指定行数据
df.iloc[[1,3],[2,5]] # 获取第1,3行的第2,5列数据
- ix优先按照标签提取,按标签提取不等同于切片,按标签是可以取到最后一个元素的
df.iloc[1:3] # 属于切片操作,取得是第一个和第二个位置的数据
df.ix[1:3] # 按照标签取值, 取得是索引为 1,2,3的三个位置上的数据
df.loc[1:3] # 按照标签取值, 取得是索引为 1,2,3的三个位置上的数据
# ix取值时如果没有对应的索引就按照位置取值
- 判断city列的值是否位
'shanghai','sh','shenzhen'
df.city.isin(['shanghai','sh','shenzhen']) # 如果是对应的位置返回True
- 提取出指定数据(查询指定列数据)
df.ix[df.city.isin(['sh','shenzhen'])] # 将city 为sh 和shenzhen 的数据提取出来
df.query('city==["sh","shenzhen"]') # 将city 为sh 和shenzhen 的数据提取出来
df.query('city==["sh","shenzhen"]').age.sum() # 求所有sh和shenzhen的年龄之和
数据汇总
- 对所有列进行数据汇总
df.groupby('city').count()
df.groupby('age').id.count() # 按照年龄分组,按照id来显示每一组年龄的总数
df.age.count() # 查询年龄总数
df.groupby(['city', 'age']).id.count() # 按照 age 和 ciry 一起分组(两个一个就分为一组),然后计数返回
数据统计
- 数据采样
df.sample(n=3) # 随机取出三条数据
2、手动设置采样权重
weights = [0, 0, 0, 0, 0.5, 0.5]
df_inner.sample(n=2, weights=weights)
123
3、采样后不放回
df_inner.sample(n=6, replace=False)
12
4、采样后放回
df_inner.sample(n=6, replace=True)
12
5、 数据表描述性统计
df_inner.describe().round(2).T #round函数设置显示小数位,T表示转置
12
6、计算列的标准差
df_inner['price'].std()
12
7、计算两个字段间的协方差
df_inner['price'].cov(df_inner['m-point'])
12
8、数据表中所有字段间的协方差
df_inner.cov()
12
9、两个字段的相关性分析
df_inner['price'].corr(df_inner['m-point']) #相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关
12
10、数据表的相关性分析
df_inner.corr()
数据输出
分析后的数据可以输出为xlsx格式和csv格式
1、写入Excel
df_inner.to_excel('excel_to_python.xlsx', sheet_name='bluewhale_cc')
12
2、写入到CSV
df_inner.to_csv('excel_to_python.csv')
Series对象
- series的对象可以直接转换为列表
list(df.iloc[-1]) # 可以直接将获取到的数据转换为列表
df.id + 1 # 可以对series里面的元素统一操作
- 可以使用unique对序列进行去重
df.age.unique() # 返回的是一个ndarray对象
- 直接通过下标获取元素,支持列表的相关操作
df.age[2:-1] # age列的数据切片
df.iloc[1][2:-1] # 第一行的数据切片
df.age[2] # df.age[-1] 不支持这种方式
list(df.age)[-1] # 获取最后一列的年龄
df.iloc[-1][-1] # 获取最后一行的最后一个数据
- 最值
df.age.max() # 最大值
df.age.mean() # 平均值
df.age.min() # 最小值
df.age.sum() # 求和
df.age.sort_values() # 按照年龄排序
df.age.unique() # 去除重复