【问题标题】:Python, DataFrame - Find a certain value in a rowPython,DataFrame - 在一行中查找某个值
【发布时间】:2020-03-13 19:32:35
【问题描述】:

我有一些问题,希望你能帮助我。 数据如下:

该列标记为高度,数字是该时间范围内的可用数据。 所以以第一行为例,在 288m 的高度,只有 10% 的数据可用(其他 90% 无法测量)

我想设置一个阈值,例如 80。所以只应包括至少包含 80% 可用数据的高度。 对于每一行,我想找到 >= 80 仍然为真的最后一个值。 然后应将找到此值的高度添加到新列中。

我可以使用以下命令显示行:df.iloc[0],这将使我获得第一行的所有值...通常我会编写一个循环,但由于这是 Pandas DataFrame,应该有一个更方便的选项用于获取条件 >= 80 为真的最后一个值。

伪代码如下所示:

  • 对于数据框中的每一行,检查值是否 >= 80
  • 提取最后一个值的列名,此条件为真
  • 将此值附加到名为“高度值”的新列中

我希望我让自己有点清楚。我对 pandas 很陌生,似乎在基于条件表达式的数据提取方面遇到了很多困难。

编辑:

前 3 行的 pandas 代码是:(时间索引不重要所以我没有包含它)

pdf = pd.DataFrame([[100.0, 100.0, 100.0, 100.0, 100.0, 99.0, 97.0, 93.0, 71.0, 45.0, 27.0, 10.0],
                    [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 94.0, 81.0, 62.0, 36.0, 9.0],
                    [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 92.0, 90.0, 68.0, 45.0, 25.0, 13.0]],
                    columns=[40.0, 58.0, 78.0, 98.0, 118.0, 138.0, 163.0, 178.0, 198.0, 228.0, 248.0, 288.0])

编辑 2: 输出数据应如下所示:

result = pd.DataFrame([[100.0, 100.0, 100.0, 100.0, 100.0, 99.0, 97.0, 93.0, 71.0, 45.0, 27.0, 10.0, 178.0],
                    [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 94.0, 81.0, 62.0, 36.0, 9.0, 198.0],
                    [100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 92.0, 90.0, 68.0, 45.0, 25.0, 13.0, 178.0]],
                    columns=[40.0, 58.0, 78.0, 98.0, 118.0, 138.0, 163.0, 178.0, 198.0, 228.0, 248.0, 288.0,'max_available_height'])

【问题讨论】:

  • 您是否可以使用数据框的文本示例并将其粘贴,也请提供您的预期输出。每行 5-10 行就可以了。
  • 阅读此How to ask a good pandas question,然后在线编辑您的问题。
  • 抱歉给您带来不便,我编辑了我的问题并将前 3 行放入。

标签: python pandas dataframe conditional-statements


【解决方案1】:

如果匹配任何值,则使用 DataFrame.anynumpy.whereDataFrame.idxmax 测试它,使用 DataFrame.iloc 进行最后匹配值的交换排序,否则返回默认值 - 例如not match:

thresh = 80
mask = pdf >= thresh
pdf['height value'] = np.where(mask.any(axis=1), mask.iloc[:,::-1].idxmax(axis=1), 'no match')
print (pdf)
    40.0   58.0   78.0   98.0  118.0  138.0  163.0  178.0  198.0  228.0  \
0  100.0  100.0  100.0  100.0  100.0   99.0   97.0   93.0   71.0   45.0   
1  100.0  100.0  100.0  100.0  100.0  100.0  100.0   94.0   81.0   62.0   
2  100.0  100.0  100.0  100.0  100.0  100.0   92.0   90.0   68.0   45.0   

   248.0  288.0 height value  
0   27.0   10.0        178.0  
1   36.0    9.0        198.0  
2   25.0   13.0        178.0 

详情

 print (mask)
   40.0   58.0   78.0   98.0   118.0  138.0  163.0  178.0  198.0  228.0  \
0   True   True   True   True   True   True   True   True  False  False   
1   True   True   True   True   True   True   True   True   True  False   
2   True   True   True   True   True   True   True   True  False  False   

   248.0  288.0  
0  False  False  
1  False  False  
2  False  False  

print (mask.iloc[:,::-1])
   288.0  248.0  228.0  198.0  178.0  163.0  138.0  118.0  98.0   78.0   \
0  False  False  False  False   True   True   True   True   True   True   
1  False  False  False   True   True   True   True   True   True   True   
2  False  False  False  False   True   True   True   True   True   True   

   58.0   40.0   
0   True   True  
1   True   True  
2   True   True  

【讨论】:

  • 在这个例子中,我想要的高度值是:0 - 178.0 1 - 198.0 2 - 178.0 因为这些是阈值 80 为真的最后一个值。跨度>
  • @Medhusalem - 你能更改数据样本以创建minimal, complete, and verifiable example吗?
  • 对不起,我不太明白你的意思。数据样本包含 10 列。每列用于不同的高度。行中的值是数据的可用性。 (我拥有的数据来自 1Hz 测量值,然后将其放入 10 分钟平均值)所以每行中的值只是说明 10 分钟间隔中有多少值是有效的。 (我无权访问 1Hz 数据)。
  • @Medhusalem - 好的,那么样本数据的预期输出是什么?
  • 就像我在第一个回复中所写:我想要的是最后一个 >= 80 为真的高度(列名)。第一行是 178.0,第二行是 198.0,第三行是 178.0。我的目标是找出每一行的最大高度,其中测量值仍然满足阈值(在本例中为 80)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多