Series第四讲 重新索引、选择、标签 操作 (下)

198 阅读6分钟

Series第四讲 重新索引、选择、标签 操作 (下)

由于第四讲涉及方法较多,此处分为上下两节各讲一部分。防止🧠混乱

重新索引、选择、标签方法总览(下)

  • Series.reindex()
  • Series.reindex_like()
  • Series.rename()
  • Series.rename_axis()
  • Series.reset_index()
  • Series.sample()
  • Series.set_axis()
  • Series.take()
  • Series.truncate()
  • Series.where()
  • Series.mask()
  • Series.add_prefix()
  • Series.add_suffix()
  • Series.filter()

详细介绍

先来创建一个Series, 一个DataFrame

In [2]: s = pd.Series([1, 2, 3, 4, None], index=['a', 'b', 'c', 'd', 'e'])      

In [3]: s                                                                       
Out[3]: 
a    1.0
b    2.0
c    3.0
d    4.0
e    NaN
dtype: float64

In [20]: df = pd.DataFrame({"num_legs": [4, 4, 2], 
    ...:                    "num_arms": [0, 0, 2]}, 
    ...:                   ["dog", "cat", "monkey"])                            

In [21]: df                                                                     
Out[21]: 
        num_legs  num_arms
dog            4         0
cat            4         0
monkey         2         2

1. Series.reindex()

Series.reindex(index=None, **kwargs)

根据指定 参数(index) 更新索引

常用参数介绍:
  • fill_value:scalar, default np.NaN 处理缺失值
In [3]: s.reindex(['a', 'b', 'f'])                                              
Out[3]: 
a    1.0
b    2.0
f    NaN
dtype: float64

# 指定缺失值 fill_value
In [4]: s.reindex(['a', 'b', 'f'], fill_value=0.98)                             
Out[4]: 
a    1.00
b    2.00
f    0.98
dtype: float64
reindex 的其他关键字参数(如果看过前几篇文章应该对下面几个参数比较熟悉了):
  • method:{None, ‘backfill’/’bfill’, ‘pad’/’ffill’, ‘nearest’}
  • copy:bool, default True
  • level:int or name
  • limit:int, default None

2. Series.reindex_like()

Series.reindex_like(other, method=None, copy=True, limit=None, tolerance=None)

根据参数 other 里的索引(行或列)替换 Series 的索引

常用参数介绍:
  • other:Object of the same data type 可以是Series或DataFrame
In [6]: s.reindex_like(pd.Series([7, 8, 9], index=['a', 'b', 'c']))             
Out[6]: 
a    1.0
b    2.0
c    3.0
dtype: float64

# 原Series中不存在的索引的value置为nan
In [6]: s.reindex_like(pd.Series([7, 8, 9], index=['a', 'b', 'c']))             
Out[6]: 
a    1.0
b    2.0
c    3.0
dtype: float64

# other也可以是df类型
In [9]: s.reindex_like(pd.DataFrame([7, 8, 9],index=['a', 'b', 'c']))           
Out[9]: 
a    1.0
b    2.0
c    3.0
dtype: float64

3. Series.rename()

Series.rename(index=None, *, axis=None, copy=True, inplace=False, level=None, errors='ignore')

重置Series的 index labels 或者 Series.name

常用参数介绍:
  • index:scalar, hashable sequence, dict-like or function, optional 前两者(scalar, hashable sequence)改变labels,后两者(dict-like or function)改变Series.name
# 改变Series.name
In [12]: s.rename('s_name')                                                     
Out[12]: 
a    1.0
b    2.0
c    3.0
d    4.0
e    NaN
Name: s_name, dtype: float64

# function更改labels
In [15]: s.rename(lambda x: 'pre_' + x)                                         
Out[15]: 
pre_a    1.0
pre_b    2.0
pre_c    3.0
pre_d    4.0
pre_e    NaN
dtype: float64

# dict更改labels 不存在的索引不会被创建(比如z)
In [17]: s.rename({'a': 'pre_a', 'b': 'pre_b', 'z': 'pre_z'})                   
Out[17]: 
pre_a    1.0
pre_b    2.0
c        3.0
d        4.0
e        NaN
dtype: float64

4. Series.rename_axis()

Series.rename_axis(**kwargs)

设置轴(行或列)的name。

注意⚠️:

  • rename() 改变的是对象的 name (Series.name)
  • rename_axis() 改变的是轴的 name (Series.index.name)
常用参数介绍:
  • mapper:scalar, list-like, optional 标量或者列表,表示轴的名称
  • index, columns:scalar, list-like, dict-like or function, optional 推荐使用
  • axis:{0 or ‘index’, 1 or ‘columns’}, default 0
  • copy:bool, default True 是否复制基础数据
  • inplace:bool, default False 是否原地修改
# 等价于 s.rename_axis(index='s_name')
In [22]: s.rename_axis('s_name')                                                
Out[22]: 
s_name
a    1.0
b    2.0
c    3.0
d    4.0
e    NaN
dtype: float64

In [46]: s.rename_axis('s_name').index                                          
Out[46]: Index(['a', 'b', 'c', 'd', 'e'], dtype='object', name='s_name')

# 修改列轴的name
In [43]: df.rename_axis(columns='my_col')                                       
Out[43]: 
my_col  num_legs  num_arms
dog            4         0
cat            4         0
monkey         2         2

In [45]: df.rename_axis(columns='my_col').columns                               
Out[45]: Index(['num_legs', 'num_arms'], dtype='object', name='my_col')

5. Series.reset_index()

Series.reset_index(level=None, drop=False, name=None, inplace=False)

生成一个新的带有重置索引的DataFrame或Series。

当索引需要被视为列时,或者索引无意义并且需要在其他操作之前重置为默认值时,此功能很有用。

常用参数介绍:
  • level:int, str, tuple, or list, default optional 多级索引时的参数
  • drop:bool, default False 如果为True,则只重置索引,并不会转换成列
  • name:object, optional (⚠️ df.reset_index没有这个参数)
In [48]: df.reset_index()                                                       
Out[48]: 
    index  num_legs  num_arms
0     dog         4         0
1     cat         4         0
2  monkey         2         2

# 转换成列后对新的列命名
In [56]: s.reset_index(name='new_name')                                         
Out[56]: 
  index  new_name
0     a       1.0
1     b       2.0
2     c       3.0
3     d       4.0
4     e       NaN

# 只重置索引,不转换成列
In [49]: df.reset_index(drop=True)                                              
Out[49]: 
   num_legs  num_arms
0         4         0
1         4         0
2         2         2

6. Series.sample()

Series.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

进行随机抽样

常用参数介绍:
  • n 和 frac 不能一起使用,当 frac>1 时,replace 必须为 True
  • replacebool, default False 允许或不允许对同一行进行多次采样
# 随机选三个
In [58]: s.sample(n=3)                                                          
Out[58]: 
b    2.0
e    NaN
d    4.0
dtype: float64

# 选一半 基数的话选 n/2-1个
In [59]: s.sample(frac=0.5)                                                     
Out[59]: 
d    4.0
b    2.0
dtype: float64

# 数量翻倍 随机选 原Series并不会改变
In [61]: s.sample(frac=2, replace=True)                                         
Out[61]: 
d    4.0
e    NaN
b    2.0
b    2.0
b    2.0
c    3.0
a    1.0
e    NaN
a    1.0
c    3.0
dtype: float64

7. Series.set_axis()

Series.set_axis(labels, axis=0, inplace=False)

行标签的索引可以通过分配类似列表或索引的方式来更改

常用参数介绍:
  • labels:list-like, Index 新索引的值,长度必须和原Series的索引长度一致
In [65]: s.set_axis(['x', 'y', 'z', 'a', 'b'])                                  
Out[65]: 
x    1.0
y    2.0
z    3.0
a    4.0
b    NaN
dtype: float64

8. Series.take()

Series.take(indices, axis=0, is_copy=None, **kwargs)

沿轴返回给定位置索引中的元素。 这意味着我们没有根据对象的index属性中的实际值进行索引。我们正在根据元素在对象中的实际位置建立索引.

常用参数介绍:
  • labels:indices:array-like 一个整数数组,表示元素位置
  • axis:{0 or ‘index’, 1 or ‘columns’, None}, default 0
# 选择第0行
In [67]: df.take([0])                                                           
Out[67]: 
     num_legs  num_arms
dog         4         0

# 选择第0行和第2行
In [70]: df.take([0, 2])                                                        
Out[70]: 
        num_legs  num_arms
dog            4         0
monkey         2         2

# 选择第0列
In [72]: df.take([0], axis=1)                                                   
Out[72]: 
        num_legs
dog            4
cat            4
monkey         2

目前来看 take 这个功能可以用 iloc 来代替实现

9. Series.truncate()

Series.truncate(before=None, after=None, axis=None, copy=True)

在某个索引值之前和之后截断Series或DataFrame,保留数据before到after(包含before和after且before必须在after的前面)

In [75]: s.truncate('b', 'c')                                                   
Out[75]: 
b    2.0
c    3.0
dtype: float64

10. Series.where()

Series.where(cond, other=nan, inplace=False, axis=None, level=None, errors='raise', try_cast=False)

替换条件为False的值。如果cond为True,原数据不变;如果cond为False,原数据用other值替换。

常用参数介绍:
  • cond:bool Series/DataFrame, array-like, or callable 判断条件
  • other:scalar, Series/DataFrame, or callable 要替换的值
  • try_cast:bool, default False 尝试将结果类型转换为输入的类型
# 大于2的不变,其他的全变成0
In [82]: s.where(s>2, 0)                                                        
Out[82]: 
a    0.0
b    0.0
c    3.0
d    4.0
e    0.0
dtype: float64

11. Series.mask()

Series.mask(cond, other=nan, inplace=False, axis=None, level=None, errors='raise', try_cast=False)

where() 相反,满足条件的用other值替换,不满足的数据保持不变

In [84]: s.mask(s>2, 0)                                                         
Out[84]: 
a    1.0
b    2.0
c    0.0
d    0.0
e    NaN
dtype: float64

12. Series.add_prefix()

Series.add_prefix(prefix)

对于Series,行标签带有前缀。对于DataFrame,列标签带有前缀

In [86]: s.add_prefix('pre_')                                                   
Out[86]: 
pre_a    1.0
pre_b    2.0
pre_c    3.0
pre_d    4.0
pre_e    NaN
dtype: float64

In [88]: df.add_prefix('pre_')                                                  
Out[88]: 
        pre_num_legs  pre_num_arms
dog                4             0
cat                4             0
monkey             2             2

13. Series.add_suffix()

Series.add_suffix(suffix)

add_prefix() 类似,不过这个是添加后缀

14. Series.filter()

Series.filter(items=None, like=None, regex=None, axis=None)

根据指定的索引标签对DataFrame的行或列进行子集设置,不会在其内容上过滤DataFrame,过滤器将应用于索引标签。

常用参数介绍:
  • items:list-like 意思是labels列表,可以指定index或columns
  • like:str 感觉像模糊匹配labels包含like的轴
  • regex:str (regular expression)
  • axis:{0 or ‘index’, 1 or ‘columns’, None}, default None 作用的轴
  • items, like, and regex 三个参数相互排斥 只能选一个
# items
In [91]: df.filter(items=['dog', 'monkey'], axis=0)                             
Out[91]: 
        num_legs  num_arms
dog            4         0
monkey         2         2

# like
In [93]: df.filter(like='og', axis=0)                                           
Out[93]: 
     num_legs  num_arms
dog         4         0

# regex 以d开始且g结尾的匹配
In [101]: df.filter(regex='^d.*g$', axis=0)                                     
Out[101]: 
     num_legs  num_arms
dog         4         0

明天继续 坚持 ✊ ✊ ✊!!!