从索引直到条件从 Pandas DataFrame 中获取行
Posted
技术标签:
【中文标题】从索引直到条件从 Pandas DataFrame 中获取行【英文标题】:Get rows from Pandas DataFrame from index until condition 【发布时间】:2019-02-18 08:45:22 【问题描述】:假设我有一个 Pandas DataFrame:
x = pd.DataFrame(data=[5,4,3,2,1,0,1,2,3,4,5],columns=['value'])
x
Out[9]:
value
0 5
1 4
2 3
3 2
4 1
5 0
6 1
7 2
8 3
9 4
10 5
现在,给定索引,我想在x
中查找行,直到满足条件。
例如,如果index = 2
:
x.loc[2]
Out[14]:
value 3
Name: 2, dtype: int64
现在我想从那个index
中找到下一个n
值大于某些threshold
的行。例如,如果threshold is 0
,结果应该是:
x
Out[9]:
value
2 3
3 2
4 1
5 0
我该怎么做?
我试过了:
x.loc[2:x['value']>0,:]
但这当然行不通,因为x['value']>0
返回一个布尔数组:
Out[20]:
0 True
1 True
2 True
3 True
4 True
5 False
6 True
7 True
8 True
9 True
10 True
Name: value, dtype: bool
【问题讨论】:
x.loc[x['value']>0]
怎么样?您可以将其与iloc
的索引相结合以获得所需的结果。
@AdrianKeister 否,因为这将返回值大于 0 的所有行。
请看我的编辑。
【参考方案1】:
使用idxmin
和切片
x.loc[2:x['value'].gt(0).idxmin(),:]
2 3
3 2
4 1
5 0
Name: value
编辑:
对于一般公式,请使用
index = 7
threshold = 2
x.loc[index:x.loc[index:,'value'].gt(threshold).idxmin(),:]
根据您在 cmets 中的描述,您似乎想从 index+1
开始而不是索引。所以,如果是这种情况,只需使用
x.loc[index+1:x.loc[index+1:,'value'].gt(threshold).idxmin(),:]
【讨论】:
我相信你听过很多,但你是个天才。谢谢老兄。 很高兴我能帮上忙!快乐编码 ;)【参考方案2】:您要过滤大于index=2
的索引和x['value']>=threshold
,然后选择这些行中的第一个n
,这可以通过.head(n)
完成。
说:
idx = 2
threshold = 0
n = 4
x[(x.index>=idx) & (x['value']>=threshold)].head(n)
输出:
# value
# 2 3
# 3 2
# 4 1
# 5 0
编辑:更改为 >=,并更新示例以匹配 OP 的示例。
由于 OP 的澄清,编辑 2:因为 n
未知:
idx = 2
threshold = 0
x.loc[idx:(x['value']<=threshold).loc[x.index>=idx].idxmax()]
这是从开始的idx
,在本例中为idx=2
,直到并包括不满足条件的第一行(在本例中为索引5
)。
【讨论】:
我不知道n
是什么。我需要从索引中搜索直到满足条件并返回找到的行。如果我知道n
是什么,我可以做x.loc[idx:n,:]
:)以上是关于从索引直到条件从 Pandas DataFrame 中获取行的主要内容,如果未能解决你的问题,请参考以下文章
pandas如何设置索引从0开始,pandas如何恢复默认索引,DataFrame如何恢复隐式索引
如何从 Pandas 日期时间索引中删除尾随零(根据需要格式化)?
如何从 Pandas DataFrame 中获取值而不是索引和对象类型
如何从包含Python3中特定索引和列的列表的dict创建Pandas DataFrame?