【问题标题】:how to check not na and not empty list in a dataframe column?如何检查数据框列中的非 na 和非空列表?
【发布时间】:2022-10-04 16:02:39
【问题描述】:
d = {'status': {0: 'No', 1: 'No', 2: 'Yes', 3: 'No'}, 'time': {0: "['Morning', 'Midday', 'Afternoon']", 1: nan, 2: "[]", 3: nan}, 'id': {0: 1, 1: 5, 2: 2, 3: 3}}
df = pd.DataFrame(d)

df 是数据框。都是对象类型。

我需要从数据框的所有列中检查 not na 和 not empty list。 我做了以下尝试 -

df['no_nans'] = ~pd.isna(df).any(axis = 1)
print(df['no_nans'])

True
False
True
False

它应该如下 -

True
False
False
False

由于时间列在第三行中有 [] 空白列表,因此它没有通过 isna() 检查。

有没有一种简单易行的方法来正确放置此检查? 提前感谢您的帮助。

【问题讨论】:

  • [] 不是时间列中的空白列表...而是字符串 '[]' &反正... isna() 不会检查其中任何一个...

标签: python pandas list dataframe isnan


【解决方案1】:

由于有时您有空列表而不是 NaN,因此您可以将 [] 替换为 Nan 以获得预期结果,如下所示:

df = df.replace('[]', np.nan)
df['no_nans'] = ~pd.isna(df).any(axis = 1)

输出 :

0     True
1    False
2    False
3    False

【讨论】:

    【解决方案2】:

    由于您有字符串,因此您需要与'[]' 进行比较:

    ~(df.eq('[]')|df.isna()).any(axis=1)
    

    输出:

    0     True
    1    False
    2    False
    3    False
    dtype: bool
    

    如果你真的有清单:

    m1 = (df.select_dtypes(object)
            .apply(lambda s: s.str.len().eq(0))
            .reindex_like(df)
            .fillna(False)
          )
    
    m2 = df.isna()
    
    ~(m1|m2).any(axis=1)
    

    列表的替代输入:

    d = {'status': {0: 'No', 1: 'No', 2: 'Yes', 3: 'No'}, 'time': {0: ['Morning', 'Midday', 'Afternoon'], 1: nan, 2: [], 3: nan}, 'id': {0: 1, 1: 5, 2: 2, 3: 3}}
    df = pd.DataFrame(d)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-07
      • 2020-03-07
      • 2021-11-24
      • 2011-12-24
      • 2018-11-26
      • 1970-01-01
      • 2012-03-20
      • 2022-11-29
      相关资源
      最近更新 更多