761棋牌_761棋牌app下载_761棋牌游戏中心大厅

761棋牌加入了众多的创新玩法,所以说在选择娱乐天体验的时候你一定要相信761棋牌,一定会给大家提供最好的娱乐享受,因为现在的名气很大。

By

Pandas 学习拾遗

(题图来自:https://realpython.com/python-pandas-tricks/)

两个 DataFrame 相除

在 Pandas 中两个数相除,如果除数是 0,或者被除数和除数都是 0,会怎么样呢?

看代码验证:

>>> import pandas as pd
>>> import numpy as np
>>> a = pd.DataFrame([[1,0,3,0]])
>>> b = pd.DataFrame([[1,2,0,0]])
>>> a
   0  1  2  3
0  1  0  3  0
>>> b
   0  1  2  3
0  1  2  0  0
>>> c = a / b
>>> c
     0    1    2   3
0  1.0  0.0  inf NaN

可以看到,在 Pandas 中,进行 DataFrame 的除法运算:

  • 如果除数是 0,被除数不为0,结果会是 inf (或者-inf)
  • 如果被除数和除数都是 0,结果会是 NaN

所以当 Pandas 中进行 DataFrame 除法运算时,结果可能会同时包含浮点数,inf,-inf,NaN,这样会使结果看起来很乱。

我们可以对运算结果进行清洗,将异常运算结果都替换为 0:

>>> d = c.replace((np.inf, -np.inf, np.nan), 0)
>>> d
     0    1    2    3
0  1.0  0.0  0.0  0.0

另外,df.div 函数虽然可以设置填充值,但是只能填充 NaN,无法处理 inf 值,所以我还是选择用 replace 统一处理。

参考:Handling division by zero in Pandas calculations

统计 NaN 值个数

NaN 值可以用 df.isnull() 检查到,返回一个 boolean 矩阵:

>>> a = pd.DataFrame([[1,2],[np.inf,np.nan],[np.nan,np.nan]], columns=['x','y'])
>>> a
          x    y
0  1.000000  2.0
1       inf  NaN
2       NaN  NaN
>>> a.isnull()
       x      y
0  False  False
1  False   True
2   True   True

(可以看到,其中 inf 异常值没有被 isnull() 检查到,这是正确的)

所以我们可以使用 df.isnull().sum() 统计 NaN 值出现的个数:

>>> a['x'].isnull().sum()   # x 列中 NaN 出现的个数
1
>>> a['y'].isnull().sum()   # y 列中 NaN 出现的个数
2
>>> a.isnull().sum(axis=0)  # 统计每列的所有行中 NaN 出现的个数,axis=0 代表检查所有行
x    1
y    2
dtype: int64
>>> a.isnull().sum(axis=1)  # 统计每行的所有列中 NaN 出现的个数,axis=1 代表检查所有列
0    0
1    1
2    2
dtype: int64

读取二进制数据流

我们知道,可以用 read_csv('./a.csv') 读取指定路径中的 csv 数据。

但如果我们直接就有 csv 数据流呢?该如何用 read_csv 直接读取进来呢?

我们可以使用 StringIO 来做到这一点,StringIO 模块主要用于在内存缓冲区中读写数据。

>>> import io
>>> s = 'x,y,z\n1,2,3'
>>> ss = io.StringIO(s)
>>> x = pd.read_csv(ss)
>>> x
   x  y  z
0  1  2  3

参考:IO Tools (Text, CSV, HDF5, …) - pandas

求四分位数(quantile)

有时候需要求数组中的中位数(50%),上四分位数(75%),下四分位数(25%),我们可以用 quantile 函数做到。

举个栗子,求上四分位数相当于对数组进行排序,然后从头取75%位置上的值。如果是取50%位置上的值,就相当于求中位数。

示例代码:

>>> a = pd.DataFrame([1,2,3,4,5,6,7,8,9,10], columns=['x'])
>>> a
    x
0   1
1   2
2   3
3   4
4   5
5   6
6   7
7   8
8   9
9  10
>>> median = a['x'].quantile(0.5)   # 求数组中的中位数
>>> median
5.5
>>> a.x[a.x < median] = median      # 将数组中小于中位数的值全部填充为中位数
>>> a
      x
0   5.5
1   5.5
2   5.5
3   5.5
4   5.5
5   6.0
6   7.0
7   8.0
8   9.0
9  10.0

参考:分位函数(四分位数)概念与pandas中的quantile函数

过滤 dataframe 列名中包含特定字符串的列

比如说我现在有三列数据,客户端重传率、服务端重传率、响应时间,现在我想把“比率”相关的列(也就是前两列)取出来,并转换成百分比形式,该怎么将这两列过滤出来呢?

我们可以使用 a.columns.str.contains('.?Rate') 的方式过滤出指定列的 bool 索引(contains可以接受正则表达式),然后将它传进 DataFrame 中就可以了,DataFrame 可以接受 bool 数组作为索引取出指定列或者行。

>>> a = pd.DataFrame([[0.0123,0.1012,12],[0.323,0.5,14]], columns=['retxclientRate','retxserverRate','transresptime'])
>>> a
   retxclientRate  retxserverRate  transresptime
0          0.0123          0.1012             12
1          0.3230          0.5000             14
>>> a.columns.str.contains('\.?Rate')
array([ True,  True, False])
>>> a.loc[:, a.columns.str.contains('\.?Rate')]
   retxclientRate  retxserverRate
0          0.0123          0.1012
1          0.3230          0.5000
>>> a.loc[:, a.columns.str.contains('\.?Rate')] * 100
   retxclientRate  retxserverRate
0            1.23           10.12
1           32.30           50.00

参考:Pandas过滤dataframe中包含特定字符串的数据

原创声明

转载请注明:呓语 » Pandas 问题拾遗