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

2021-03-02 15:02:01 浏览数 (1)

知识点

  • 空值删除和填充
  • 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:刷选过缺失值得到的新数据是存为副本还是直接在原数据上进行修改。
代码语言:javascript复制
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

代码语言:javascript复制
# 默认参数:删除行,只要有空值就会删除,不替换
df.dropna()

name

toy

born

1

Batman

Batmobile

1940-04-25

代码语言:javascript复制
df.dropna(how='any')

name

toy

born

1

Batman

Batmobile

1940-04-25

代码语言:javascript复制
df.dropna(how='all')  # 全部是空值才会删除

name

toy

born

0

Alfred

NaN

NaT

1

Batman

Batmobile

1940-04-25

2

Catwoman

Bullwhip

NaT

代码语言:javascript复制
df.dropna(thresh=2)  # 至少出现两个空值删除

name

toy

born

1

Batman

Batmobile

1940-04-25

2

Catwoman

Bullwhip

NaT

代码语言:javascript复制
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

0 人点赞