【问题标题】:Removing elements from Pandas Series of lists从 Pandas 系列列表中删除元素
【发布时间】:2019-04-22 05:02:54
【问题描述】:

我一直在从网站上寻找解决方案和提示,但找不到与我的案例直接相关的问题。

我已经从各个站点抓取了文本数据,并使用str.split('\n') 拆分了文本。文本包含很多 '\n' 并且以这种方式拆分使其非常可取。 (如果这种方法太糟糕,请告诉我。)

df['scrape']
0       \nWebsite:\n\n\n\nVisit\n\n \nWhite paper:\n\n...
1       \nWebsite:\n\n\n\nVisit\n\n \nWhite paper:\n\n...
2       \nWebsite:\n\n\n\nVisit\n\n \nWhite paper:\n\n...
3       \nWebsite:\n\n\n\nVisit\n\n \nWhite paper:\n\n...
4       \nWebsite:\n\n\n\nVisit\n\n \nWhite paper:\n\n...
5       \nWebsite:\n\n\n\nVisit\n\n \nWhite paper:\n\n...

结果是一个 Pandas 系列列表——所有元素都是字符串列表。

df['split'] = df['scrape'].str.split('\n')
0       [, Website:, , , , Visit, ,  , White paper:, ,...
1       [, Website:, , , , Visit, ,  , White paper:, ,...
2       [, Website:, , , , Visit, ,  , White paper:, ,...
3       [, Website:, , , , Visit, ,  , White paper:, ,...
4       [, Website:, , , , Visit, ,  , White paper:, ,...
5       [, Website:, , , , Visit, ,  , White paper:, ,...
6       [, Website:, , , , Visit, ,  , White paper:, ,...

我想去掉每个列表中的 None 元素('' 和'')。

我尝试循环:

for i in series:
    While ‘’ in i:
        i.remove(‘’)

上面的代码适用于我制作的一些任意示例,但使用我的真实数据会产生错误。

for i in df['split']:
...     while '' in i:
...         i.remove('')
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: argument of type 'float' is not iterable

我不确定为什么我的数据出现错误。可以得到一些建议吗?谢谢!

【问题讨论】:

  • 不要将列表存储在一个系列中
  • 如果我不将列表存储在系列中,那么对于这种情况有什么建议?
  • 解决方案感谢 Toby 的想法: def remover(list): return [s for s in list if s !='' and s != ' '] df['new'] = df[' split'].apply(remover) 使用此方法,您无需删除 NaN 值。

标签: python string pandas list series


【解决方案1】:

您可以使用列表推导:

new_series = [s for s in series if s!='' and s!=' ' and s!=None]

要将列表推导应用于 Pandas 系列列表(本质上是列表列表)中的每个元素,您需要像这样嵌套列表推导:

new_series = [[s for s in element if s!='' and s!=' ' and s!=None] for element in series]

【讨论】:

  • 不起作用。我尝试了 series = [s for s in df['split'] if s!='' and s!=' '] 但它仍然包含 '' 和 ' ' 值。
  • 您还需要添加无条件吗?查看我更新的示例
  • 仍然无法正常工作...也尝试将其转换为列表列表。您的建议产生了一个大列表,但我必须将它们分开。
  • 嗯,我想我明白了,您想将列表理解应用于系列中的每个列表(本质上是列表列表)。如果我理解正确,这应该有效:[[s for s in x if s!='' and s!=' ' and s!=None] for x in series]
  • 感谢您不断更新。这个答案看起来像我想要的,但老实说不知道为什么它仍然会出错.. [[s for s in x if s!='' and s!='' and s!=None] for x in df ['split']] >>> [[s for s in x if s!='' and s!=' ' and s!=None] for x in df['split']] ):文件“”,第 1 行,在 文件“”,第 1 行,在 中 TypeError: 'float' object is not iterable
猜你喜欢
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 2014-12-19
  • 2013-11-25
相关资源
最近更新 更多