【问题标题】:Pandas - find occurrence within a subsetPandas - 在子集中查找事件
【发布时间】:2020-09-04 17:44:03
【问题描述】:

我在 for 循环中从未格式化的摘要表中剥离值,并且我需要在出现另一个特定字符串值之后动态查找字符串值的索引位置。我以used this question 为起点。示例数据框:

import pandas as pd
df = pd.DataFrame([['Small'],['Total',4],['Medium'],['Total',12],['Large'],['Total',7]])

>>>df
        0     1
0   Small   NaN
1   Total   4.0
2  Medium   NaN
3   Total  12.0
4   Large   NaN
5   Total   7.0

假设我想在“Medium”之后找到“Total”。我可以通过以下方式找到“中”的位置:

MedInd = df[df.iloc[:,0]=='Medium'].first_valid_index()

>>>MedInd
2

在此之后,我遇到了对查询设置子集限制的问题:

>>>MedTotal = df[df.iloc[MedInd:,0]=='Total'].first_valid_index()
IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).

对编程来说还是很新,可以使用一些方向来解决这个错误。搜索错误本身似乎是我应该定义子集的顺序问题,但到目前为止我一直无法修复它。任何帮助将不胜感激。

编辑: 所以我最终通过将子集限制移到前面,在 first_valid_index 子句之外解决了这个问题,如下所示(从this reddit comment 获得的建议):

MedTotal = df.iloc[MedInd:][df.iloc[:,0]=='Total'.first_valid_index()

这确实会引发以下警告: 用户警告:布尔系列键将被重新索引以匹配 DataFrame 索引。 但输出符合预期,这只是正在寻找的值的索引号。

我不知道在给出警告的情况下这是否总是会产生预期的结果,因此我将继续扫描答案以寻找其他解决方案。

【问题讨论】:

    标签: python pandas indexing


    【解决方案1】:

    这样就可以了

    def find_idx(df, first_str, second_str):
        first_idx = df[0].eq(first_str).idxmax()
        rest_of_df = df.iloc[first_idx:]
        return rest_of_df[0].eq(second_str).idxmax()
    
    find_idx(df, 'Medium', 'Total')
    

    【讨论】:

      【解决方案2】:

      您可能想使用shift:

      df[df.iloc[:,0].shift().eq('Medium') & df.iloc[:,0].eq('Total')]
      

      输出:

             0     1
      3  Total  12.0
      

      【讨论】:

      • 我的实际数据集在 'Medium' 和 'Total' 行之间有其他数据和空格,我认为这可能会导致我得到的结果是一个空数据框。有关如何使用 shift 方法解决此问题的建议?
      • 如果是这种情况,你应该尝试用样本数据来反映它。
      • 是的,我很抱歉。格式非常不规则 - 我在构建假数据框时肯定错过了一些细微差别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多