【问题标题】:Return the column name(s) for a specific value in a pandas dataframe返回熊猫数据框中特定值的列名
【发布时间】:2019-03-07 14:36:12
【问题描述】:

我在其他语言(例如 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。这样做的最佳方式是什么?

谢谢

【问题讨论】:

标签: python pandas


【解决方案1】:

看到你只有一行,那么你可以在结果上调用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

您也可以将idxmax 与参数axis=1 一起使用:

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

Out[52]:
'col7'

【讨论】:

  • 非常感谢!我已经尝试了所有三个并且它们有效。我更喜欢第三种解决方案,即(df == 38.15).idxmax(axis=1)[0],因为它立即给出了列的值
  • 我同意,顾名思义,您可以像这样使用idxmax 并不是很明显,但是axis 参数是专门为逐列查找最大值而设计的
  • 嗨!有没有一种快速的方法可以为每一行执行此操作(df.columns[(df == 38.15).iloc[0]])?我的意思是,对于每一行,我想获取包含特定值的列的名称。我试过为 cicle 做一个,但我有 11 毫米的行......所以虽然它有效,但它需要很多时间。谢谢!
  • 如果我必须检查多个号码。例如38.15 和 37.56 并打印特定列?
  • 每一行怎么做?如何使用字符串创建一列,将这一行中的所有列命名为 38.15? df['correct_columns'] = ', '.join(df.columns[df==38.15]) - 不适用于每一行。说“indeces 太多”,我想它不检查行,而是检查整个数据框。
【解决方案2】:

您可以使用数据框切片,然后获取列名:

df.ix[:,df.loc[0] == 38.15].columns

输出:

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

【讨论】:

  • 谢谢,如果我确实想要索引并且速度很快,那就太好了,但在这种情况下,列名最适合我的问题。
【解决方案3】:

假设我们有这个 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'   

【讨论】:

    【解决方案4】:

    只是为了把一些不同的东西扔进擂台:

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

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 2019-02-10
      • 2020-04-25
      • 2018-12-25
      相关资源
      最近更新 更多