从Pandas数据框中删除空列表行

45

我有一个数据框,其中一些列是空列表,另一些则包含字符串列表:

       donation_orgs                              donation_context
0            []                                           []
1   [the research of Dr. ...]   [In lieu of flowers , memorial donations ...]

我想返回一个数据集,但不包含其中包含空列表的行。

我尝试检查空值:

dfnotnull = df[df.donation_orgs != []]
dfnotnull

dfnotnull = df[df.notnull().any(axis=1)]
pd.options.display.max_rows=500
dfnotnull

我已经尝试循环检查存在的值,但我认为列表没有像我想的那样返回Null或None:

dfnotnull = pd.DataFrame(columns=('donation_orgs', 'donation_context'))
for i in range(0,len(df)):
    if df['donation_orgs'].iloc(i):
        dfnotnull.loc[i] = df.iloc[i]

以上三种方法都只是返回原始数据框中的每一行。


1
根据我的经验,在数据帧中将数据存储在列表中是相当危险的。它可能会导致分组和聚合函数出现问题。如果必须这样做,请考虑使用元组,这似乎效果更好。 - Woody Pride
5个回答

85

为了避免转换为str并实际使用lists,您可以这样做:

为了避免将数据类型转换为字符串并仍然使用列表,您可以执行以下操作:

df[df['donation_orgs'].map(lambda d: len(d)) > 0]

它将donation_orgs列映射为每行列表的长度,并仅保留具有至少一个元素并过滤掉空列表的行。

它返回

Out[1]: 
                            donation_context          donation_orgs
1  [In lieu of flowers , memorial donations]  [the research of Dr.]

如预期。


1
这应该是被接受的答案。更加优雅。 - Leothorn
7
"df[df['donation_orgs'].map(len) > 0]" 的意思是筛选出在数据框 df 中 'donation_orgs' 列中包含至少一个元素的行。"df[df['donation_orgs'].map(bool)]" 与上述代码等价,也是用于筛选出 'donation_orgs' 列中不为空的行。 - MrKsn
df[df['donation_orgs'].map(bool)] 这个方法最好,因为它甚至可以处理空值。 - Sameer Girolkar

38

你可以尝试将数据帧视为字符串而不是列表进行切片:

import pandas as pd
df = pd.DataFrame({
'donation_orgs' : [[], ['the research of Dr.']],
'donation_context': [[], ['In lieu of flowers , memorial donations']]})

df[df.astype(str)['donation_orgs'] != '[]']

Out[9]: 
                            donation_context          donation_orgs
1  [In lieu of flowers , memorial donations]  [the research of Dr.]

12
您可以使用以下一行代码:
df[(df['donation_orgs'].str.len() != 0) | (df['donation_context'].str.len() != 0)]

5

假设您从CSV文件中读取数据,则另一个可能的解决方案如下:

import pandas as pd

df = pd.read_csv('data.csv', na_filter=True, na_values='[]')
df.dropna()

na_filter定义了要识别为 NaN 的其他字符串。我在 pandas-0.24.2 上测试过。


1

可能是数据类型不同,这样做可能会有所帮助。

df[df.astype(str)['donation_orgs'] != '[]']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接