如何从列类型列表中删除 pandas DataFrame 中的空值

Posted

技术标签:

【中文标题】如何从列类型列表中删除 pandas DataFrame 中的空值【英文标题】:How to remove empty values from the pandas DataFrame from a column type list 【发布时间】:2019-12-22 00:38:38 【问题描述】:

只是期待一种解决方案,从具有列表值的列中删除空值,在某种意义上,我们已经预先替换了一些字符串,它是列表的字符串表示列。

df.color 中,我们只是将*._Blue 替换为空字符串:

示例数据框:

df = pd.DataFrame( 'Bird': ["parrot", "Eagle", "Seagull"], 'color': [ "['Light_Blue','Green','Dark_Blue']", "['Sky_Blue','Black','White', 'Yellow','Gray']", "['White','Jet_Blue','Pink', 'Tan','Brown', 'Purple']"] )

>>> df
      Bird                                              color
0   parrot                 ['Light_Blue','Green','Dark_Blue']
1    Eagle      ['Sky_Blue','Black','White', 'Yellow','Gray']
2  Seagull  ['White','Jet_Blue','Pink', 'Tan','Brown', 'Pu...

上述DF的结果:

>>> df['color'].str.replace(r'\w+_Blue\b', '')
0                                 ['','Green','']
1           ['','Black','White', 'Yellow','Gray']
2    ['White','','Pink', 'Tan','Brown', 'Purple']
Name: color, dtype: object

通常在python中很容易做到如下......

>>> lst = ['','Green','']
>>> [x for x in lst if x]
['Green']

恐怕可以做到以下几点。

df.color.mask(df == ' ')

【问题讨论】:

对于包含列表或其他难以粘贴对象的数据框,应使用to_dict创建minimal reproducible example,以便于重新创建。 @user3483203,很抱歉..刚刚更新了帖子上的信息,希望对您有所帮助。 所以你的列不是列表列,而是列表的字符串表示列? 这是真的@user3483203 在帖子中添加了相同的内容。 【参考方案1】:

使用filterapply的另一种方式:

(df['color'].str.replace(r'\w+_Blue\b', '')
     .apply(lambda x: list(filter(bool, ast.literal_eval(x)))))

0                              [Green]
1         [Black, White, Yellow, Gray]
2    [White, Pink, Tan, Brown, Purple]

【讨论】:

thnx @anky_91 :-)【参考方案2】:

您没有一列列表,而是有一列包含列表的字符串表示形式。您可以使用ast.literal_evalstr.endswith 一步完成所有操作。我会在这里使用列表理解,它应该比 apply 更快


import ast

fixed = [
    [el for el in lst if not el.endswith("Blue")]
    for lst in df['color'].apply(ast.literal_eval)
]

df.assign(color=fixed)

      Bird                              color
0   parrot                            [Green]
1    Eagle       [Black, White, Yellow, Gray]
2  Seagull  [White, Pink, Tan, Brown, Purple]

【讨论】:

Thnx 英里 @user3483203 .【参考方案3】:

您可以使用explode(pandas 0.25.0) 然后将列表连接回来

 df['color'].str.replace(r'\w+_Blue\b', '').explode().loc[lambda x : x!=''].groupby(level=0).apply(list)

【讨论】:

thnx @Wen 但是np.nan 在版本'0.21.0' 中不起作用,正在寻找可能适用于几乎所有版本的通用解决方案 @pygo 检查更新 它带有错误AttributeError: 'Series' object has no attribute 'explode' @pygo explode 是 pandas 0.25.0 中的新功能,请更新你的 pandas :-) 嗯,好吧,从这个意义上说,我们需要有一些其他的方法.. tnx

以上是关于如何从列类型列表中删除 pandas DataFrame 中的空值的主要内容,如果未能解决你的问题,请参考以下文章

如何从列中删除日期和月份(类型:datetime64)[重复]

Pandas:如何从给定(行,列)对列表的 DataFrame 中检索值?

根据 Pandas 中另一列中的索引从列中获取数据

从列列表中删除选择子查询到主查询

熊猫从列中可用的列表数据中扩展行

根据相邻列值 Pandas 从列中按第一个或第二个空格提取字符串