知识点
- 空值删除和填充
apply、applymap
用法shift()
用法- value_counts()和mean():统计每个元素的出现次数和行(列)的平均值
缺失值和空值处理
概念
空值:空值就是没有任何值,""
缺失值:df
中缺失值为nan
或者naT
(缺失时间),在S型数据中为none
或者nan
相关函数
df.dropna()
删除缺失值df.fillna()
填充缺失值df.isnull()
df.isna()
官方文档
df.dropna()
函数作用:删除含有空值的行或列,删除缺失值
代码语言:javascript复制DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
-
axis
:维度,0
表示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 | |
---|---|---|---|
0 | 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 | |
---|---|---|---|
0 | 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()
主要作用:填充缺失值
代码语言:javascript复制DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
代码语言:javascript复制dates
代码语言:javascript复制DatetimeIndex(['2019-09-24', '2019-09-25', '2019-09-26', '2019-09-27',
'2019-09-28', '2019-09-29'],
dtype='datetime64[ns]', freq='D')
代码语言:javascript复制# 在数据df的基础上增加一列E
data = df.reindex(index=dates[0:4], columns=list(df.columns) ['E'])
代码语言:javascript复制# 将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 |
统计值
代码语言:javascript复制data.mean()
# data.mean(0) 默认是每个列上的均值
代码语言:javascript复制A 0.081423
B -0.486257
C 1.203052
D 0.468599
E 1.000000
dtype: float64
代码语言:javascript复制data.mean(1) # 求行轴上的均值
代码语言:javascript复制2019-09-24 0.141075
2019-09-25 0.424772
2019-09-26 0.640926
2019-09-27 0.418582
Freq: D, dtype: float64
代码语言:javascript复制pd.Series([1, 3, 5, np.nan, 6, 8], index=dates)
代码语言:javascript复制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
代码语言:javascript复制# shift函数将结果移动两个单位,广播机制
s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2)
s
代码语言:javascript复制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
代码语言:javascript复制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用法(重点)
代码语言:javascript复制# 求出每列的max 和 min
def f(x):
return pd.Series([x.min(), x.max()], index=["min", "max"])
df.apply(f)
代码语言:javascript复制f = lambda x: x.max() - x.min()
df.apply(f)
# df.apply(f, axis="columns") 表示在行上执行
代码语言:javascript复制A 3.478075
B 1.387917
C 2.985920
D 2.643529
dtype: float64
关于applymap函数:得到df数据中浮点值的格式化字符串
代码语言:javascript复制formatFunc = lambda x: "%.2f" % x
df.applymap(formatFunc) # 输出的数据为2位小数
统计每个value出现的次数
代码语言:javascript复制s = pd.Series(np.random.randint(0,7, size=10))
s
代码语言:javascript复制0 3
1 5
2 2
3 4
4 6
5 5
6 4
7 4
8 1
9 3
dtype: int32
代码语言:javascript复制s.value_counts()
代码语言:javascript复制4 3
5 2
3 2
6 1
2 1
1 1
dtype: int64