pandas使用

数据准备

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()  # 去除重复
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值