【问题标题】:Search a list in column in pandas and return a string value if found and return null if not在 pandas 的列中搜索一个列表,如果找到则返回一个字符串值,如果没有则返回 null
【发布时间】:2020-07-06 12:50:41
【问题描述】:

我有

['2013 (63 reg)', '76,869 miles', '2.0L','Manual', 'Diesel</li>\n</ul>']
['2011 (61 reg)', 'Estate', '2.0L', '135BHP','Manual', 'Diesel', '4 owners</li>\n</ul>']
['2011 (11 reg)', 'Saloon', '112,000 miles', '2.1L', '201BHP','Manual', 'Diesel', '4 owners', 'Partservice history</li>\n</ul>']
['2007 (07 reg)', 'Saloon', '98,000 miles','3.0L', '222BHP', 'Automatic', 'Diesel']

在数据框 df 的列数据中 我有这个代码来检查单词'miles'是否存在如果是它返回包含英里的字符串如果不是它应该返回空并将它存储在一个列表中

miles=[]
sub = 'miles'
for f in df['Data'] :
    for text in f:
        if sub in text:
            miles.append(text)
        else:
            miles.append('')`

它为所有文本值返回' ',而不是每个列表 我在哪里得到了这样的东西

['',
 '76,869 miles',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 '112,000 miles',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 '',
 '98,000 miles',
 '',
 ]

我想去哪里

['76,869 miles',
'',
'112,000 miles',
'98,000 miles']

【问题讨论】:

  • 您的if 条件目前工作正常!您已经在 else 期间附加了 ' '。请查看您的nested 循环。在没有附加的情况下运行它,看看你的数据会是什么样子!
  • 当我删除 else 时,结果是 ['76,869 英里','112,000 英里','98,000 英里'],我不想要,因为我希望代码能够识别列表是否不包含'英里'并返回每个列表的空值..我尝试了很多我无法弄清楚
  • 在这种情况下,您必须使用generator 并且不要在for 循环下追加。涉及next函数。

标签: python pandas dataframe search arraylist


【解决方案1】:

好吧,您正在使用nested 循环来检查每个列表中的每个element。您的代码当前检查元素中是否有miles 并返回它,如果不是,则只需附加'' 对应于没有miles 的元素。

但您的逻辑是搜索每个列表的elements,如果list 不包含所需的target,那么我们需要代码回复Hey, I'm not there

所以,我们必须使用generatornext 函数。

data = [['2013 (63 reg)', '76,869 miles', '2.0L',
         'Manual', 'Diesel</li>\n</ul>'],
        ['2011 (61 reg)', 'Estate', '2.0L', '135BHP',
         'Manual', 'Diesel', '4 owners</li>\n</ul>'],
        ['2011 (11 reg)', 'Saloon', '112,000 miles', '2.1L', '201BHP',
         'Manual', 'Diesel', '4 owners', 'Partservice history</li>\n</ul>'],
        ['2007 (07 reg)', 'Saloon', '98,000 miles',
         '3.0L', '222BHP', 'Automatic', 'Diesel']]


new = [next((t for t in item if "miles" in t), "Miles Not Found")
       for item in data]

print(new)

输出:

['76,869 miles', 'Miles Not Found', '112,000 miles', '98,000 miles']

【讨论】:

  • 使用数据框列 df['Data'] 时,如果为 true,则返回整个列表,并正确返回未找到的里程。 new = [next((t for t in item if "miles" in t), "Miles Not Found") for item in df['Data']...当我使用上述列表时,它刚刚返回 [ ['not found', 'not found', 'not found', 'not found',] ,我认为我们可以使用 df['Data'] 调整代码以仅返回英里字符串而不是整个列表,仍然试图弄清楚如何
  • 存储在数据框列中的列表
  • @HalaElHenawy 你用.to_list() 处理列吗?拥有listlists
  • 不,但即使我这样做了,结果仍然与所述相同,我有一列,列中的每一行都有一个列表。
  • 谢谢,我刚把data改成df['Data'].to_list()
猜你喜欢
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 2011-02-08
  • 1970-01-01
  • 2021-06-28
相关资源
最近更新 更多