熊猫系列:按值查找列

时间:2020-09-10 09:00:56

标签: pandas series

我有一个熊猫系列和一个值。我想查找包含我的值的列并获取列名称。该值保证只出现一次。

Column A| Column B | Column C
   rtz       xyz          abc

我的值是abc,我想要Column C作为返回值。

我该怎么做?

编辑:

我有一个系列,因此任何使用df.columns等的东西都将不起作用,因为系列没有column属性。

3 个答案:

答案 0 :(得分:3)

numpy.where用于匹配值的位置,建立索引,然后将nextiter技巧一起使用,以返回第一个匹配值,如果没有匹配,它也可以工作:

i, c = np.where(df == 'abc')
print (c)
[2]

print (next(iter(df.columns[c]), 'no match'))
Column C

i, c = np.where(df == 'abc1')
print (c)
[]

print (next(iter(df.columns[c]), 'no match'))
no match

编辑:使用Series的解决方案:

s = pd.Series(['rtz','xyz','abc'], index=list('ABC'))
    
print (next(iter(s[s == 'abc'].index), 'no match'))
C

print (next(iter(s[s == 'abc1'].index), 'no match'))
no match

替代:

print (next(iter(s.index[s == 'abc']), 'no match'))
C

print (next(iter(s.index[s == 'abc1']), 'no match'))
no match

答案 1 :(得分:0)

让我们尝试选择字符串值。使用.iloc访问器提取列数组/列表,并使用[index]

调用列表中的元素
(df.columns[(df=='abc').iloc[0]])[0]

答案 2 :(得分:0)

因此,在等待答案的过程中,我想到了一个看似幼稚的答案:

for col_name, value in s.items():
    if value == 'abc':
        //do stuff
        break

仅在for循环中迭代该系列。是的,我有点老派,对函数式编程范例还不太习惯。因此我也倾向于寻求可能更好的解决方案。

在应用jezraels解决方案后,我感觉我的脚本变慢了。 (该特定代码被称为很多),我期望通过简单的循环来加快速度,但是事实证明我错了:

s = pd.Series(['rtz','abc','xyz'], index=list('ABC'))  

%%timeit
next(iter(s[s == 'abc'].index), 'no match')
224 µs ± 3.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
for col_name, value in s.items():
    if value == 'abc':
        col_name
        break
15.9 µs ± 159 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

在此特定用例(小型系列,例如,在我的用例中,大约20个项目),简单的for循环的速度快10倍以上。实际上,这很令人困惑。因此,如果性能很重要,并且您的系列很小,我想这就是要走的路。