【问题标题】:How can I get the values satisfying some conditions in a dataframe如何获得满足数据框中某些条件的值
【发布时间】:2021-10-13 14:57:51
【问题描述】:

我将 excel 数据读取为 pandas 的数据框,其中每一行都有两个非 NaN 值(其他都是 NaN)

names Unnamed:1 Unnamed:2 Unnamed:3 ~ Unnamed:19 Unnamed:20
NaN NaN 1.3 NaN ~(NaN) 10.4 NaN
NaN NaN NaN 2.7 ~(NaN) NaN 12.7
~ ~ ~ ~ ~ ~ ~
name_ccdd NaN 1.3 NaN ~(NaN) 9.3 NaN
~ ~ ~ ~ ~ ~ ~
name_yyzz 0.5 NaN NaN ~4.7~ NaN NaN

我想找到一个包含单词的特定行(例如“ccdd”)并以一般方式获取非 NaN 值(例如 1.3 和 9.3)

我做了一个布尔值,其中包含显示哪个行索引包含一个单词(例如“ccdd”)

import pandas as pd
import numpy as np

filename= '~/data.xlsx'
df = pd.read_excel(filename, engine='openpyxl')
mask = df[df.columns[0]].str.contains('ccdd')

print(mask)

0       NaN
1       NaN
2     False
3     False
4     False
5      True
6     False
7     False
8     False
9     False
10    False
11    False
12    False
13    False

第 5 行包含关于我想要获得两个浮点值的数据。但我不能走得更远。

在之前的一篇文章(Get row and column index of the value in Pandas df)中找到了类似的答案,但是不知道怎么用。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这将为您提供正确的行索引:

    mask=df['names'].str.contains('ccdd')
    mask=mask.replace(np.nan, False, regex=True)
    list(df.names.index[mask])
    

    输出:

    [3]
    

    【讨论】:

    • 感谢您的回答。但我无法将names 方法应用于df 数据框。我收到消息'DataFrame' object has no attribute 'names',最后一个代码中的m 是什么?是mask吗?
    • m 是一个错字,应该是mask。我不确定为什么names 不起作用,但如果是.names,您可以像这样用['names'] 替换它; list(df['names'].index[mask]).
    • 这是我的错,我在真正的问题中使用了另一个索引名称,现在我明白了你的意思。谢谢。
    【解决方案2】:

    要选择满足条件的一行或一组行,您可以使用以下命令:

    subSelection=df[df["names"].str.contains("ccdd")]
    

    要打印行,可以使用print(subSelection),要打印所选行的索引,可以使用print(list(subSelection.index))

    【讨论】:

    • 感谢您的回复。我尝试了您留下的代码并收到错误“无法使用包含 NA / NaN 值的非布尔数组进行掩码”。这可能是因为掩码阵列中有 2 个 Nan。所以我在第一个回复中添加了na=False 选项。这给了我一个行值。我填写我可以检查该行中的元素并获取值。
    【解决方案3】:

    您可以在str.contains() 中传递 na 参数,因此基本上 na 参数根据您的输入将 NaN 值设置为 True/False:

    mask = df[df.columns[0]].str.contains('ccdd',na=False)
    

    现在终于将掩码传递给您的 df:

    df[mask]
    #OR
    df.loc[mask]
    

    【讨论】:

    • 非常感谢您的回答。如果如果有 df[mask] 或 df.loc[mask] 那么我会得到类似的输出,但在 0 和 1 行中没有 NaN。最终,我想在“ccdd”行中获得 1.3、9.3 的浮点值。如何获取值?
    • 我的错。我可以从您的回复中获取行值,尤其是 na=False 选项。它真的帮了我很多!
    • @dave 因为如果你想包括 NaN,那么设置 na=True 它也将包括 NaN,你将在其他行中获得 1.3 和 9.3....顺便说一句,很高兴这个解决方案有帮助... .happy 编码 :)
    猜你喜欢
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2023-03-08
    相关资源
    最近更新 更多