【问题标题】:Search Pandas dataframe, start new search on find搜索 Pandas 数据框,在 find 上开始新的搜索
【发布时间】:2018-08-22 00:36:25
【问题描述】:

情况是这样 - 我有一个如下所示的数据框:

       Col1      Stats       Values       Details
0    Item545
1                yes           5             77
2                no            13            55
3                maybe         7             44
4    Item327
5                yes           3             99
6                no            7             5
7                maybe         88            7

我需要做的是首先搜索 Col1,然后在 Stats 列上开始新的搜索。例如,查找“Item327”,然后从该行查找“no”。我的最终目标是这个例子是将第 6 行添加到一个新数组中。然后继续搜索。

我已经开始使用 iterrows,但我一直在做第二次搜索

for i, row in df.iterrows():
    if row[0] == "Item327":
        ## Do another iterrows here?
        ## if row[1] == "no":
        ##     output = row

    ## Continue original iterrows 

任何建议将不胜感激 - 谢谢!

【问题讨论】:

  • 也许您应该考虑在每一行上重复项目编号,以便对于每个项目 ID,您有一个唯一的是、否和可能行。
  • 你能提供一个df.to_dict() 显示的例子吗?这样可以让别人更容易复制/粘贴一个例子并提供答案......看起来你真的应该有一个不管是 Col1 还是 Stats 的索引。 (或者只是转动东西)

标签: python pandas dataframe search


【解决方案1】:

根据您的示例:

df = pd.DataFrame([[0, 'Item545', '', '', ''], [1, '', 'yes', 5, 77], [2, '', 'no', 13, 55], [3, '', 'maybe', 7, 44]], columns=['Id', 'Col1', 'Stats', 'Values', 'Details'])

我会先用 NaN 替换空白,然后向前填充 Col1 中的项目:

df = df.replace('', pd.np.nan)

df.Col1 = df.Col1.fillna(method='ffill')

这样您就可以轻松地在 DataFrame 中进行搜索:

res = df[(df.Col1 == 'Item545') & (df.Stats == 'no')]

然后,您可以使用以下方法提取符合这些条件的每一行的内容: res.itertuples() 如果你想使用 NamedTuples 或 res.values.tolist()

【讨论】:

  • 谢谢,我会记住这一点。不幸的是,有些条目带有通用的子标题。例如 [0, 'Item545', 'resource', '', ''] [0, 'Item327', 'resource', '', '']
猜你喜欢
  • 2018-12-24
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 2021-03-08
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
相关资源
最近更新 更多