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進行數據分析比賽進階之路(一)

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