pandas 数据分析总结


part1:基础操作

  1. dataframe 初始化(空/非空)
  2. dataframe 列名操作
  3. 数据拼接(行/列拼接,暴力拼接)
import numpy as np
import pandas as pd


# 1.dataframe 初始化
## 空dataframe
df_data = pd.DataFrame()
df_data = pd.DataFrame(data_list,columns=columns_list)

# 2.dataframe 列名操作
## 获取dataframe 列名 
columns = df_data .columns
## 强制修改列名,数量应该保持一致
df_data.columns=['col1','col2','col3']
## rename方法,提供修改对象的一一映射,不需要修改的不用管
df_data.rename(columns={'A':'a', 'B':'b', 'C':'c'}, inplace = True)

# 3.dataframe 拼接 (行/列拼接、暴力拼接)
## 行处理 append
## a1.append,series 需要index/列名的对应,才能加对位置,否则新增列
s = pd.Series({"a":3,"b":3,"c":3})
df_data = df_data.append(s,ignore_index=True)

## a2. append,dataframe,需要保持列名一致,默认不忽略index,重复会保留
df_data = df_data.append( df_data2,ignore_index=False )

## b.新增行 df.loc[i]  直接在目标行插入一行数据,按位置对应
df_data.loc[3] = [3,3,3]
## c.这是按照索引去新增行,以下是通用的新增行的办法:
df_data = df_data.reset_index()
next_index = len(df_data)
df_data.loc[next_index ] = line_list
## d.可以将转换成list 然后对list进行处理
df_data.values.tolist()
## d.删除操作
df_data.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
# 删除 index 为 0 1 2 的三行 并保留原数据
df_data.drop(labels = [0,1,2],axis=0, inplace=False) 
# 删除 columns为 a,b的两列 并保留原数据
df_data.drop(labels = ['a','b'],axis=1, inplace=False) 
# 清空数据
df_data.drop(df_data.index,inplace=True)

part2:数据分析

  1. dataframe 筛选 (in,条件+逻辑)
  2. 数据聚合分析
# 法1 完整表达

## 基本逻辑筛选
1) df_data[df_data[col1]>x]
2) df_data[df_data[col1]!=x]
3) df_data[~(df_data[col1]==x)]    等价于 2)式
## 组合必须加括号,因为> < == != 的优先级大于 &
4) df_data[(df_data[col1]>x) & (df_data[col2]<=y] 
## 筛选出某字段为NAN的数据
5)df_data[np.isnan(df_data[col1])]
## 包含于操作 in
df_data_in_list  = df_data[df_data['col3'].isin(list)]

# 法2 query 方法
df_data.query("a>b")  等价于 df_data[df_data['a']>df_data['b']]
df_data.query("a=b") 
df_data.query("a=b") 
## query 赋值(修改原数据),需要将inplace参数设置为True
df.query("tag=='B' and uv<1000",inplace=True)['growth'] = growth 

part3:其它补充

df_data.info()                      # 查看宏观的信息,数据类型,数据大小,数据行数列数,数据列名
df_data.col.value_counts()  #统计列中各项值出现频率
df_data.sort_values()          #按照某列排序
# 示例:按照三列排序,降序
df_data = df_data.sort_values(['a','b','增长率'], ascending=False)

df_data.groupby()       # 分组,之后可进行一些统计计算,均值/汇总/排名等

# 按照a,b分组,按照c列排序
df_data_rank =  df_data.groupby(['a','b'])[c].rank(method='min',ascending=False)

# 按照a分组,按照b求标准差,然后重新设置 index 因为分组之后index只取了部分的,重置index之后会好看一些?
df_data_std = df_data.groupby(['a'])['b'].std().reset_index()
# 分组后 按照c求均值,按照d求和
df_data.groupby(['a','b']).agg({'c':'mean','d':'sum'})
df_data.groupby('a')['b'].agg({'mean':np.mean, 'std': np.std})

# 多列相同统计方法 apply()
df_data.groupby('a').apply(np.mean)

# 行列转换,将date_id行对应的值,转换成列名
df_data = df_data.pivot_table(values= 'uv',index='id',columns='date_id').reset_index()

# 批量应用某函数(方法)DataFrame.apply()
def func(str):
	str_x = str_x.split('/')[2]
	return str_x
result = df_data['birth_date'].apply(func)

## DataFrame.apply() 实例——按照多条件给dataframe打标签
# -- 标签A: rank<1500,增幅小于5
# -- 标签B: rank<1500,增幅大于5
# -- 标签C: 其它所有,不关心
def define_label(rank,growth):
    if rank <= 1500 and growth<=5:
        return "A"
    elif rank <= 1500 and growth>5:
        return "B"
    else:
        return "C"
df['tag'] = df.apply(lambda row:define_label(row['rank'],row['growth']),axis=1)

#如果不用apply,需要对apply进行三次筛选,然后分别赋值,即:
df[df['rank']<1500 & df['growth']<=5]['tag'] =  'A'
df[df['rank']<1500 & df['growth']>5]['tag'] =  'B'
df[df['rank']>=1500]['tag'] =  'C'
# 没有实际跑过,看起来也不麻烦嘛。。。(实际可能不可行!!!)
# 而这样处理才能成功赋值(大概是因为df2是从别处截取出来的??)
df2.loc[df2['date_id']=='2019-08-10','uv']= np.na

待补充: dataframe 拼接
参考:
Pandas使用DataFrame进行数据分析比赛进阶之路(一)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章