我想根据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
你们的任何帮助都会非常感谢,谢谢。 。
答案 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.eval
和np.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}}参数中有所不同。