在 Pandas 数据框中返回特定值对应的列名。

13

我曾在其他语言中,如R或SQL中找到了这个选项,但我不太确定如何在Pandas中实现。

所以我有一个包含1262列和1行的文件,并且需要在特定值出现的每一次都返回列标题。

比如说,这个测试数据框:

Date               col1    col2    col3    col4    col5    col6    col7 
01/01/2016 00:00   37.04   36.57   35.77   37.56   36.79   35.90   38.15 

我需要定位列名,例如当值为38.15时。最好的方法是什么?

谢谢


这个问题与 https://stackoverflow.com/q/42639207 相关,一般情况下是“根据指定条件获取列名”。 - 把友情留在无盐
4个回答

19

考虑到你只有一行数据,那么可以在结果上调用iloc[0],然后使用它来遮罩列:

In [47]:
df.columns[(df == 38.15).iloc[0]]

Out[47]:
Index(['col7'], dtype='object')

以上内容的分解:

In [48]:
df == 38.15

Out[48]:
             Date   col1   col2   col3   col4   col5   col6  col7
01/01/2016  False  False  False  False  False  False  False  True

In [49]:
(df == 38.15).iloc[0]

Out[49]:
Date    False
col1    False
col2    False
col3    False
col4    False
col5    False
col6    False
col7     True
Name: 01/01/2016, dtype: bool

您也可以使用带有参数axis=1idxmax

In [52]:
(df == 38.15).idxmax(axis=1)[0]

Out[52]:
'col7'

非常感谢!我已经尝试了所有三种方法,它们都有效。我更喜欢第三种解决方案,即(df == 38.15).idxmax(axis=1)[0],因为它可以立即给出列的值。 - Helena K
我同意,一开始并不明显你可以像这样使用 idxmax,因为名称暗示了索引,但是 axis 参数专门设计用于按列查找最大值。 - EdChum
1
你好!有没有一种快速的方法可以为每一行执行以下操作(df.columns[(df == 38.15).iloc[0]])?我的意思是,对于每一行,我想获取包含特定值的列的名称。我尝试使用for循环,但是我有1100万行...所以虽然它可以工作,但是需要很长时间。谢谢! - Valeria Lobos Ossandón
如果我需要检查多个数字,例如38.15和37.56,并打印特定的列? - Shriganesh Patil
1
如何对每一行执行此操作?如何创建一个带有字符串的列,该字符串命名此行中所有值为38.15的列? df ['correct_columns'] =','.join(df.columns [df == 38.15])-无法针对每一行工作。说“索引太多”,我想它没有检查行,而是整个数据框架。 - Anton Makarov
显示剩余2条评论

3
您可以使用数据框切片,然后获取列名:
df.ix[:,df.loc[0] == 38.15].columns

输出:

Index([u'col7'], dtype='object')

谢谢,如果我确实需要索引并且速度很快,那将会很好。但在这种情况下,列名最适合解决我的问题。 - Helena K

1
假设我们有这个 df。只检查 df 的前三行,我们想要获取特定值为5的列的名称。
df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))
    df.head(3)

我们可以做到这一点:

In[61]:
for index, row in df[:3].iterrows():
    for i in range(len(df.columns)): 
        if row[i] == 5:
            print(row.index[i])
Out[61]:
'D'   

0

为了给大家提供一些不同的东西:

row = df.iloc[0]
row.reset_index().set_index(0).loc[38.15]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接