如果列值是日期列表,如何根据条件计算 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
有一个带有视图列的 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