知识点
- 空值删除和填充
-
用法apply、applymap
-
用法shift()
- value_counts()和mean():统计每个元素的出现次数和行(列)的平均值
缺失值和空值处理
概念
空值:空值就是没有任何值,
""
缺失值:
df
中缺失值为
nan
或者
naT
(缺失时间),在S型数据中为
none
或者
nan
相关函数
-
删除缺失值df.dropna()
-
填充缺失值df.fillna()
-
df.isnull()
-
df.isna()
官方文档
df.dropna()
df.dropna()
函数作用:删除含有空值的行或列,删除缺失值
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
复制
-
:维度, 表示axis
行,index
表示1
列,默认为0columns
-
how:
-
全部为缺失值则删除该行或者列all:
-
至少有一个则删除any:
-
-
:指定至少出现了thresh个才删除thresh
-
:指定在某些列的子集中选择出现了缺失值的列删除,不在子集中不会删除(axis决定行\列)subset
-
:刷选过缺失值得到的新数据是存为副本还是直接在原数据上进行修改。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()
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] 删除。