【问题标题】:return the column name for a column containig a text value返回包含文本值的列的列名
【发布时间】:2019-08-10 16:46:30
【问题描述】:

我有一个凌乱的数据集。每行有 8 个单词,分布在 196 列中。任务是在每一行中找到包含该单词的列。示例:单词“Paid”可以在 196 列中的任何一列中,但我们知道它就在那里。我们需要知道它在哪一列。感谢您的帮助。

【问题讨论】:

  • 对于其他数据,是空白还是某种数字?
  • 欢迎来到 SO!我认为如果您提供一个小示例表来更好地说明您的问题,我们会更容易为您提供帮助。如需更多信息,请阅读我们的minimal reproducible example写作指南。
  • 每行有 200 列。列 4:196 包含 NaN 或 8 个单词之一。
  • 感谢您的欢迎 Niayesh!一个示例表听起来是个好主意!我明天一上电脑就发一篇。
  • @LeeJack 其他列只是我不需要的垃圾,可以替换值。我只是无法删除它们,因为每一列在一行或多行中都有一个单词。

标签: python string pandas indexing


【解决方案1】:

我认为eq + idxmax 在这里是最简单的几个词,并且完全匹配并保证它在那里。由于它只有 8 个单词,也许只是一个列表理解并连接结果:

样本数据:

import pandas as pd
import numpy as np

np.random.seed(123)
l = ['']*192 + ['paid', 'foo', 'bar', 'baz']
df = pd.DataFrame([np.random.choice(l, replace=False, size=196)
                   for i in range(5)])

代码:

pd.concat([df.eq(word).idxmax(1).rename(word) for word in ['paid', 'foo', 'bar', 'baz']], 
          axis=1)

#   paid  foo  bar  baz
#0   112  167  184  142
#1   186   93   17  173
#2    56  142  179   67
#3    15   78   38   79
#4   116   84   18   61

如果您只需要检查列 [4:196] 使用 df.iloc[:, 4:197].eq(word) 而不是检查每一列

【讨论】:

  • 谢谢@ALollz,这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 2017-06-03
相关资源
最近更新 更多