如果列值是日期列表,如何根据条件计算 pandas DF 中的行数?

How to count rows in pandas DF on condition, if column value is a list of dates?

有一个带有视图列的 DF,其中包含日期列表。我需要计算这个 DF 的非空行,即 Views != [1970-01-01 00:00:00] (type: list of datetimes)

的行

我尝试了什么:

a = datetime.strptime('1970-01-01 00:00:00', '%Y-%m-%d %H:%M:%S')
result.loc[result.Views[0] != a ]
result.loc[result.Views[0][0] != a ]
result.loc[result.Views[0][0] != [a] ]
result.loc[result.Views[0] != [a] ]

还尝试了 isin、unique funcs,但都给出了 KeyValue 错误或 'list not hashable' 错误

求求你帮忙

更新

有效代码:

a = datetime.strptime('1970-01-01 00:00:00', '%Y-%m-%d %H:%M:%S')
test = result.explode('Views')
out = test[test.Views != a]
result['Count'] = result.Views.apply(lambda x: sum(y != a for y in x))
viewed = len(result.loc[result.Count > 0]) #Total rows with not empty views

但我怀疑有一种更简单快捷的方法来计算这些东西。尽管如此,如果此列表是 DF 中的值,我如何通过索引获取列表中的项目? - 仍未得到答复

更新

最短解:

print(len(df.loc[df["Views"].apply(lambda l: pd.Series(l).explode().ne("1970-01-01").all())]))

使用 DataFrame.explode 将列表转换为标量 - 展平,因此可能比较:

df = result.explode('Views')
a = datetime.strptime('1970-01-01 00:00:00', '%Y-%m-%d %H:%M:%S')
out = df[df.Views != a ]

如果需要计数值,请使用生成器 sum:

result['count'] = result.Views.apply(lambda x: sum(y != a for y in x))
  • 假设您的嵌入列表总是一排长
  • explode() 和逻辑运算符作为掩码
  • 过滤器和长度
import numpy as np
import pandas as pd
import random

df = pd.DataFrame(
    {
        "ObjectClass": np.repeat("flats", 20),
        "Views": [
            np.random.choice([pd.to_datetime("1-jan-1970")]+list(pd.date_range("1-aug-2021", periods=3)), random.randint(1,3)) for i in range(20)
        ],
    }
)

print(len(df.loc[df["Views"].apply(lambda l: pd.Series(l).explode().ne("1970-01-01").all())]))
df