【问题标题】:Finding the index of rows based on a sequence of values in a column of pandas DataFrame根据 pandas DataFrame 列中的值序列查找行的索引
【发布时间】:2020-05-11 17:26:27
【问题描述】:

我有一个 DataFrame,其中有一列包含三个唯一的字符串。我需要做的是生成一个包含行索引的列表,这些行的索引在良好之后具有“非常糟糕”,但在“糟糕”之后不是“非常糟糕”。

import random
df = pd.DataFrame({
    'measure': [random.randint(0,10) for _ in range(0,20)],
})

df['status'] = df.apply(
    lambda x: 'good' if x['measure'] > 4 else 'very bad' if x['measure'] < 2  else 'bad',
    axis=1)
    measure    status
0         8      good
1         8      good
2         0  very bad
3         5      good
4         2       bad
5         3       bad
6         9      good
7         9      good
8        10      good
9         5      good
10        1  very bad
11        7      good
12        7      good
13        6      good
14        5      good
15       10      good
16        3       bad
17        0  very bad
18        3       bad
19        5      good

我希望得到这个列表:

[2, 10]

有没有一种解决方案?

我不想使用数值,因为它们在这里纯粹用于生成 DataFrame 或遍历所有行,这对我的用例来说计算量很大。

【问题讨论】:

  • 你能清理/编辑你的问题吗?我在你的数据中看不到“非常好”。
  • @ScottBoston 感谢您发现这一点,完成。

标签: python python-3.x pandas dataframe


【解决方案1】:

如果你的数据框索引是默认范围索引,那么你可以使用这个:

np.where((df['status'] == 'very bad') & (df['status'].shift() == 'good'))[0]

输出:

array([ 2, 10], dtype=int64)

否则,您可以使用以下内容:

irow = np.where((df['status'] == 'very bad') & (df['status'].shift() == 'good'))[0]
df.index[irow]

【讨论】:

【解决方案2】:

试试eqshiftloc

s = df.status.eq('very bad')
s1 = df.status.eq('good').shift()

In [30]: (s & s1).loc[lambda x:x].index.tolist()
Out[30]: [2, 10]

【讨论】:

    【解决方案3】:
    df.loc[lambda x:x.status.eq('very bad') & x.status.shift().eq('good')].index.tolist()
    

    【讨论】:

    • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案以添加解释并说明适用的限制和假设。 From Review
    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 2014-11-26
    • 2019-04-06
    • 1970-01-01
    • 2017-12-31
    • 2021-07-31
    • 2013-08-12
    • 2023-01-03
    相关资源
    最近更新 更多