天天看點

pandas系列3_缺失值處理和apply用法

知識點

  • 空值删除和填充
  • apply、applymap

    用法
  • shift()

    用法
  • value_counts()和mean():統計每個元素的出現次數和行(列)的平均值

缺失值和空值處理

概念

空值:空值就是沒有任何值,

""

缺失值:

df

中缺失值為

nan

或者

naT

(缺失時間),在S型資料中為

none

或者

nan

相關函數

  • df.dropna()

    删除缺失值
  • df.fillna()

    填充缺失值
  • df.isnull()

  • df.isna()

官方文檔

df.dropna()

函數作用:删除含有空值的行或列,删除缺失值

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)           

複制

  • axis

    :次元, 表示

    index

    行,

    1

    表示

    columns

    列,預設為0
  • how:

    • all:

      全部為缺失值則删除該行或者列
    • any:

      至少有一個則删除
  • thresh

    :指定至少出現了thresh個才删除
  • subset

    :指定在某些列的子集中選擇出現了缺失值的列删除,不在子集中不會删除(axis決定行\列)
  • inplace

    :刷選過缺失值得到的新資料是存為副本還是直接在原資料上進行修改。
df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'],
                   "toy": [np.nan, 'Batmobile', 'Bullwhip'],
                   "born": [pd.NaT, pd.Timestamp("1940-04-25"),pd.NaT]})
df           

複制

name toy born
Alfred NaN NaT
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
# 預設參數:删除行,隻要有空值就會删除,不替換
df.dropna()           

複制

name toy born
1 Batman Batmobile 1940-04-25
df.dropna(how='any')           

複制

name toy born
1 Batman Batmobile 1940-04-25
df.dropna(how='all')  # 全部是空值才會删除           

複制

name toy born
Alfred NaN NaT
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
df.dropna(thresh=2)  # 至少出現兩個空值删除           

複制

name toy born
1 Batman Batmobile 1940-04-25
2 Catwoman Bullwhip NaT
df.dropna(subset=['name', 'born'])           

複制

name toy born
1 Batman Batmobile 1940-04-25

df.fillna()

主要作用:填充缺失值

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)           

複制

dates           

複制

DatetimeIndex(['2019-09-24', '2019-09-25', '2019-09-26', '2019-09-27',
               '2019-09-28', '2019-09-29'],
              dtype='datetime64[ns]', freq='D')           

複制

# 在資料df的基礎上增加一列E
data = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])           

複制

# 将E列的前2行設為1
data.loc[dates[0]:dates[1], 'E'] = 1 
data           

複制

A B C D E
2019-09-24 -1.636419 0.222190 0.504764 0.614839 1.0
2019-09-25 -0.516706 -0.084145 1.191989 0.532722 1.0
2019-09-26 1.841656 -0.917348 0.064767 1.574627 NaN
2019-09-27 0.637159 -1.165726 3.050687 -0.847791 NaN

統計值

data.mean()  
# data.mean(0)  預設是每個列上的均值           

複制

A    0.081423
B   -0.486257
C    1.203052
D    0.468599
E    1.000000
dtype: float64           

複制

data.mean(1)   # 求行軸上的均值           

複制

2019-09-24    0.141075
2019-09-25    0.424772
2019-09-26    0.640926
2019-09-27    0.418582
Freq: D, dtype: float64           

複制

pd.Series([1, 3, 5, np.nan, 6, 8], index=dates)           

複制

2019-09-24    1.0
2019-09-25    3.0
2019-09-26    5.0
2019-09-27    NaN
2019-09-28    6.0
2019-09-29    8.0
Freq: D, dtype: float64           

複制

# shift函數将結果移動兩個機關,廣播機制
s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2)  
s           

複制

2019-09-24    NaN
2019-09-25    NaN
2019-09-26    1.0
2019-09-27    3.0
2019-09-28    5.0
2019-09-29    NaN
Freq: D, dtype: float64           

複制

df.sub(s, axis='index')           

複制

A B C D
2019-09-24 NaN NaN NaN NaN
2019-09-25 NaN NaN NaN NaN
2019-09-26 0.841656 -1.917348 -0.935233 0.574627
2019-09-27 -2.362841 -4.165726 0.050687 -3.847791
2019-09-28 -4.284321 -5.942288 -2.905034 -4.137728
2019-09-29 NaN NaN NaN NaN

apply用法(重點)

# 求出每列的max 和 min
def f(x):
    return pd.Series([x.min(), x.max()], index=["min", "max"])
df.apply(f)           

複制

f = lambda x: x.max() - x.min()
df.apply(f)
# df.apply(f, axis="columns") 表示在行上執行           

複制

A    3.478075
B    1.387917
C    2.985920
D    2.643529
dtype: float64           

複制

關于applymap函數:得到df資料中浮點值的格式化字元串

formatFunc = lambda x: "%.2f" % x
df.applymap(formatFunc)  # 輸出的資料為2位小數           

複制

統計每個value出現的次數

s = pd.Series(np.random.randint(0,7, size=10))
s           

複制

0    3
1    5
2    2
3    4
4    6
5    5
6    4
7    4
8    1
9    3
dtype: int32           

複制

s.value_counts()           

複制

4    3
5    2
3    2
6    1
2    1
1    1
dtype: int64           

複制

本文參與 騰訊雲自媒體分享計劃 ,歡迎熱愛寫作的你一起參與!

本文分享自作者個人站點/部落格

http://www.renpeter.cn

複制

如有侵權,請聯系 [email protected] 删除。