程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Pandas(四)—— 缺失數據、文本數據

編輯:Python

Python模塊 —— Pandas

  • Pandas(四)—— 缺失數據、文本數據
    • 七、缺失數據
      • 7.1 缺失值的統計和刪除
        • 7.1.1 缺失值的統計
        • 7.1.2 缺失值的刪除
      • 7.2 缺失值的填充和插值
        • 7.2.1 缺失值的填充
        • 7.2.2 缺失值的插值
        • 7.2.3 缺失記號
    • 八、文本數據
      • 8.1 正則表達式的基礎
      • 8.2 文本處理的五類操作
      • 8.3 常用字符串函數
      • 8.4 劇本數據集

Pandas(四)—— 缺失數據、文本數據

大家可以關注知乎或微信公眾號的share16,我們也會同步更新此文章。

七、缺失數據

7.1 缺失值的統計和刪除

7.1.1 缺失值的統計

缺失數據可以使用isnaisnull(兩個函數沒有區別)來查看每個單元格是否缺失;

  1. 結合mean可以計算出每列缺失值的占比,如:df.isna().mean() 或 df.isnull().mean();
  2. 若想查看某列缺失或非缺失的行,可利用Series上的 isna 或 notna 進行布爾索引;
  3. 若想同時對幾個列,檢索出全部為缺失或至少有一個缺失或沒有缺失的行,可使用 isna, notna 和 any, all 的組合;
import numpy as np
import pandas as pd
ls = [['A',1,11],['B',np.nan,12],['C',3,np.nan]]
df = pd.DataFrame(ls,columns=['name','x','y'])
print('查看單元格是否缺失:')
print(df.isna(), df.isnull(), sep='\n\n')
print('\n計算每列缺失值的占比:')
print(df.isna().mean(), df.isnull().mean(), sep='\n\n')
print('\n某列 缺失或非缺失的行:')
print(df[df.x.isna()], df[df.x.notna()], sep='\n\n')
print('\n某幾個列 缺失或非缺失的行:')
print(df[df[['x','y']].notna().all(1)], df[df[['x','y']].isna().any(1)], sep='\n\n')





7.1.2 缺失值的刪除

數據處理中經常需要根據缺失值的大小、比例或其他特征來進行 行樣本或列特征 的刪除,pandas中提供了dropna函數來進行操作。

df.dropna(axis,how,thresh,subset,inplace)

  • axis:默認0,即刪除包含缺失值的行;1為刪除包含缺失值的列;
  • how:默認any,即至少有一個NA值,則刪除該行/列;all即所有值都是NA,則刪除該行/列;
  • thresh:默認None,刪除的非缺失值個數阈值,非缺失值沒有達到這個數量的相應維度會被刪除;
  • subset:默認None,備選的刪除子集;

7.2 缺失值的填充和插值

7.2.1 缺失值的填充

df.fillna(value,method,axis,inplace,limit,downcast)

  • value:默認None,用於填充NA的值;可以是標量、字典、系列或數據幀,不能是列表;
  • method:默認None,還可是backfill、bfill、pad、ffill;pad/ffill:用前面的元素填充;backfill/bfill:用後面的元素填充;
  • limit:表示連續缺失值的最大填充次數,默認None;
  • downcast:字典,默認None;

7.2.2 缺失值的插值

在關於interpolate函數的文檔描述中,列舉了許多插值法,包括了大量Scipy中的方法。比較常用且簡單的三類情況,即線性插值、最近鄰插值和索引插值。

df.interpolate(method,axis,limit,inplace,limit_direction,limit_area,downcast)

  • method:默認linear,還可是time、index,values、nearest,zero等;
  • limit:表示連續缺失值的最大填充次數,默認None;
  • limit_direction:若指定了limit,當method是pad/ffill,取值是forward;當method是backfill/bfill,取值是backwards;若未指定limit,若method是backfill/bfill,取值backwards,否則是forward;

7.2.3 缺失記號

在python中,利用None表示缺失值,該元素除了等於自己本身之外,與其他任何元素不相等;
在numpy中,利用np.nan表示缺失值,該元素除了不和其他任何元素相等之外,和自身的比較結果也返回False;
在時間序列的對象中,pandas利用pd.NaT表示缺失值,它的作用和np.nan是一致的;

''' 值得注意的是: '''
import numpy as np
import pandas as pd
s1 = pd.Series([1,2,np.nan])
s2 = pd.Series([1,2,np.nan])
ls = ['s1==s2', 's1.equals(s2)']
for i in ls:
print('{}的結果是:\n{}\n'.format(i, eval(i)))
''' 運行結果: s1==s2的結果是: 0 True 1 True 2 False dtype: bool s1.equals(s2)的結果是: True '''

八、文本數據

8.1 正則表達式的基礎

  • 一般字符集,如:r’PY.*N’、r’apple’等;
  • 常見字符集,如下圖;
  • 常用函數re.findall(r'xxxx',string),以列表形式返回;



8.2 文本處理的五類操作

以 s = pd.Series() 為例,首先將其類型進行轉換,即s.str;其次,常見的五類操作:

  • 拆分:s.str.split()
  • 合並:s.str.join('-')用某個連接符把Series中的字符串列表連接起來,如果列表中出現了非字符串元素則返回NaN;s.str.cat()用於合並兩個序列,主要參數為連接符sep、連接形式join以及缺失值替代符號na_rep,其中連接形式默認為以索引為鍵的左連接;
  • 匹配:s.str.contains(pat,···)返回每個字符串是否包含正則模式(pat)的布爾序列;s.str.startswith()s.str.endswith()返回每個字符串以給定模式為開始和結束的布爾序列,它們都不支持正則表達式;還有match/find/rfind等函數;
  • 替換:s.str.replace()
  • 提取:s.str.extract()s.str.extractall()s.str.findall()
import pandas as pd
s1 = pd.Series(['上海市黃浦區方浜中路249號', '上海市寶山區密山路5號'])
s2 = s1.str
type(s1) # >> pandas.core.series.Series
type(s2) # >> pandas.core.strings.accessor.StringMethods
# 拆分
lst = ["s1[0].split('區')", "s1[0].split('[市區路]')", "s2.split('[市區路]')",\
"s2.split('[市區路]',n=1,expand=True)","s2.split('[市區路]',n=6,expand=True)"]
for i in lst:
print('{}的運行結果:\n{}\n'.format(i,eval(i)))



8.3 常用字符串函數

  • 字母型函數:upper、lower、title、capitalize、swapcase,這五個函數主要用於字母的大小寫轉化;
  • 數值型函數:pd.to_numeric(arg, errors=’raise’, downcast=None),參數arg取值是列表/元組/一維數組/series,errors默認raise(直接報錯),還可取值coerce(設為NaN)、ignore(保持原來的字符串);
  • 統計型函數:count、len等;
  • 格式型函數:除空型(strip、rstrip、lstrip)、填充型(pad、rjust、ljust、center、zfill等);

8.4 劇本數據集

現有一份權力的游戲劇本數據集點此下載

問題:
1.  計算每一個Episode的台詞條數;

import pandas as pd
df = pd.read_csv('/xxx/07 劇本.csv')
df.columns = df.columns.str.strip()
df.groupby(['Season','Episode'])['Episode Title'].count()

2.  以空格為單詞的分割符,請求出單句台詞平均單詞量最多的前五個人;

df['num'] = df.Sentence.str.split().str.len()
df.groupby('Name').num.mean().sort_values(ascending=False).head()

3.  若某人的台詞中含有問號,那麼下一個說台詞的人即為回答者。若上一人台詞中含有n個問號,則認為回答者回答了n個問題,請求出回答最多問題的前五個人;

s = pd.Series(df.Sentence.values, index=df.Name.shift(-1))
s.str.count('\?').groupby('Name').sum().sort_values(ascending=False).head()

謝謝大家


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved