看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
searchsorted()
方法是 Pandas 中用于查找元素在已排序数组中的插入位置的一种方法。它适用于 Index
和 Series
数据类型。
searchsorted()
方法主要用于以下两种数据类型:
pandas.Index
pandas.Series
查找应插入元素以保持顺序的索引。在排序后的Series self中查找索引,这样,如果value中的相应元素在索引之前插入,则self的顺序将保持不变。
searchsorted(value,
side='left',
sorter=None)
序列必须单调排序,否则可能会返回错误的位置。pandas 不会为你检查这个。
value
:标量值、列表或数组。要查找插入位置的元素或元素数组。如果 value
是多个元素,它会返回一个包含插入位置的数组。side
:字符串,默认值为 'left'
。这个参数决定了在遇到相同值时,插入位置是放在左边还是右边。'left'
:返回第一个可以插入的位置。'right'
:返回最后一个可以插入的位置。sorter
:一维数组,包含原始数组的排序顺序。这个参数通常用于对未排序的数据进行插入位置查找。在使用这个参数时,searchsorted()
会按照提供的顺序索引进行查找。该方法返回一个整数或者整数数组,表示可以插入 value
的索引位置。
searchsorted()
方法可以用于查找数据在已排序序列中的插入位置,常用于二分搜索、插值或需要保持数据有序的场景中。尤其在金融数据、时间序列数据分析中非常有用。
示例如下:
ser = pd.Series([1, 2, 3])
ser
'''
0 1
1 2
2 3
dtype: int64
'''
ser.searchsorted(4)
# 3
ser.searchsorted([0, 4])
# array([0, 3])
ser.searchsorted([1, 3], side='left')
# array([0, 2])
ser.searchsorted([1, 3], side='right')
# array([1, 3])
ser = pd.Series(pd.to_datetime(['3/11/2000', '3/12/2000', '3/13/2000']))
ser
'''
0 2000-03-11
1 2000-03-12
2 2000-03-13
dtype: datetime64[ns]
'''
ser.searchsorted('3/14/2000')
# 3
ser = pd.Categorical(
['apple', 'bread', 'bread', 'cheese', 'milk'], ordered=True
)
ser
'''
['apple', 'bread', 'bread', 'cheese', 'milk']
Categories (4, object): ['apple' < 'bread' < 'cheese' < 'milk']
'''
ser.searchsorted('bread')
# 1
ser.searchsorted(['bread'], side='right')
# array([3])
# 如果值不是单调排序的,则可能会返回错误的位置
ser = pd.Series([2, 1, 3])
ser
'''
0 2
1 1
2 3
dtype: int64
'''
ser.searchsorted(1)
# 0 # wrong result, correct would be 1
import pandas as pd
# 构造一个已排序的 Series
s = pd.Series([1, 3, 5, 7, 9])
# 查找值 6 的插入位置
insert_pos = s.searchsorted(6)
# 输出
print(f"Series 数据: \n{s}")
print(f"值 6 的插入位置: {insert_pos}")
输出结果:
Series 数据:
0 1
1 3
2 5
3 7
4 9
dtype: int64
值 6 的插入位置: 3
side
参数# 查找值 7 的插入位置,放在第一个合适的位置(左边)
insert_pos_left = s.searchsorted(7, side='left')
# 查找值 7 的插入位置,放在最后一个合适的位置(右边)
insert_pos_right = s.searchsorted(7, side='right')
# 输出
print(f"Series 数据: \n{s}")
print(f"值 7 的插入位置(左边插入): {insert_pos_left}")
print(f"值 7 的插入位置(右边插入): {insert_pos_right}")
输出结果:
Series 数据:
0 1
1 3
2 5
3 7
4 9
dtype: int64
值 7 的插入位置(左边插入): 3
值 7 的插入位置(右边插入): 4
# 查找多个值的插入位置
insert_pos_multiple = s.searchsorted([2, 4, 6])
# 输出
print(f"Series 数据: \n{s}")
print(f"值 2, 4, 6 的插入位置: {insert_pos_multiple}")
输出结果:
Series 数据:
0 1
1 3
2 5
3 7
4 9
dtype: int64
值 2, 4, 6 的插入位置: [1 2 3]
sorter
参数# 构造一个未排序的 Series
s_unsorted = pd.Series([7, 1, 5, 9, 3])
# 提供一个排序顺序
sorter = s_unsorted.argsort()
# 查找值 6 的插入位置,使用排序索引
insert_pos_sorted = s_unsorted.searchsorted(6, sorter=sorter)
# 输出
print(f"未排序的 Series 数据: \n{s_unsorted}")
print(f"排序顺序索引: {sorter}")
print(f"值 6 的插入位置(根据排序顺序): {insert_pos_sorted}")
输出结果:
未排序的 Series 数据:
0 7
1 1
2 5
3 9
4 3
dtype: int64
排序顺序索引: [1 4 2 0 3]
值 6 的插入位置(根据排序顺序): 3
searchsorted()
方法在处理已排序数据或需要插入数据并保持顺序的场景中非常有用。通过调整 side
和 sorter
参数,用户可以灵活控制插入行为,特别适合在金融数据、时间序列数据处理或需要高效查找插入位置的情况下使用。
更新时间:2024-08-13 09:09:20 标签:pandas python 排序