获取列名,其中包含python pandas中任何行的特定值

时间:2018-06-19 08:19:10

标签: python pandas dataframe input

我想根据pandas中特定列中包含的特定值,从整个数据库中获取列名(假设数据库包含超过100行且超过50列)。

在Bkmm3(来自印度的成员)的帮助下,我在数字方面取得了成功但在字母术语上失败了。我尝试的方式是:

df = pd.DataFrame({'A':['APPLE','BALL','CAT'],
                    'B':['ACTION','BATMAN','CATCHUP'],
                    'C':['ADVERTISE','BEAST','CARTOON']})
response = input("input")
for i in df.columns: if(len(df.query(i + '==' + str(response))) > 0):
print(i)`

然后输出出现错误:

Traceback (most recent call last): NameError: name 'APPLE' is not defined

你们的任何帮助都会非常感谢,谢谢。 。

2 个答案:

答案 0 :(得分:5)

isin / eq适用于DataFrame,您可以100%对其进行矢量化:

df.columns[df.isin(['APPLE']).any()]  # df.isin([response])

或者,

df.columns[df.eq(response).any()]

    索引(['A'],dtype ='object')

以下是使用DataFrame.evalnp.logical_or的迂回方式(你是否在列上循环):

df.columns[
    np.logical_or.reduce(
        [df.eval(f"{repr(response)} in {i}") for i in df]
)]
Index(['A'], dtype='object')

答案 1 :(得分:0)

首先,你的错误的原因。对于pd.DataFrame.query,与常规比较一样,您需要使用引号括起字符串。所以这可行(注意"引用对):

response = input("input")

for i in df.columns:
    if not df.query(i + '=="' + str(response) + '"').empty:
        print(i)

inputAPPLE
A

接下来,您可以通过pd.DataFrame.any提取索引和/或列。 coldspeed's solution在这里很好,我将展示如何使用类似的语法来提取行标签和列标签。

# columns
print(df.columns[(df == response).any(1)])
Index(['A'], dtype='object')

# rows
print(df.index[(df == response).any(0)])
Int64Index([0], dtype='int64')

请注意,在这两种情况下,您都会得到Index个对象的结果。代码仅在提取的属性和axis的{​​{1}}参数中有所不同。