Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据当前使用熊猫的总年数筛选行_Python_Pandas - Fatal编程技术网

Python 根据当前使用熊猫的总年数筛选行

Python 根据当前使用熊猫的总年数筛选行,python,pandas,Python,Pandas,假设我有一个带有以下列的数据框df: import pandas as pd df = pd.read_csv('data.csv') df Cities Start_date End_date data_avail A 1-03-2000 1-03-2012 12 B 1-12-2002 1-12-2005 3 C 1-04-2000 1-04-2010 10 D 1-04-2009 1-04-2016

假设我有一个带有以下列的数据框
df

import pandas as pd

df = pd.read_csv('data.csv')
df
Cities  Start_date  End_date    data_avail
A       1-03-2000   1-03-2012   12
B       1-12-2002   1-12-2005   3
C       1-04-2000   1-04-2010   10
D       1-04-2009   1-04-2016   7
E       1-04-2003   1-05-2007   5
如何了解2005年至2010年期间存在至少三年数据的所有城市。例如,在上述示例中,只有城市A、C和E满足上述条件。因此,预期产出为:

df
Cities  Start_date  End_date    total_no
A       1-03-2000   1-03-2012   12
C       1-04-2000   1-04-2010   10
E       1-04-2003   1-05-2007   5

首先按指定列删除可能缺少的行:

df = df.dropna(subset=['Start_date','End_date'])
想法是按年份创建范围,将范围
r
与长度转换为相交集,然后传递到:

Lsit理解备选方案,布尔列表的输出传递给
布尔索引

df['Start_date'] = pd.to_datetime(df['Start_date'])
df['End_date'] = pd.to_datetime(df['End_date'])

r = set(range(2005, 2011))
z = zip(df['Start_date'].dt.year, df['End_date'].dt.year)
L = [len(set(range(s, e + 1)) & r) > 2 for s, e in z]

df = df[L]
print (df)
  Cities Start_date   End_date  data_avail
0      A 2000-01-03 2012-01-03          12
2      C 2000-01-04 2010-01-04          10
4      E 2003-01-04 2007-01-05           5

这对你有用吗

data.csv

Cities,Start_date,End_date,data_avail
A,1-03-2000,1-03-2012,12
B,1-12-2002,1-12-2005,3
C,1-04-2000,1-04-2010,10
D,1-04-2009,1-04-2016,7
E,1-04-2003,1-05-2007,5
def can_允许(世界其他地区):
允许的年数=[2005、2006、2007、2008、2009、2010]
开始年份=行[“开始日期”]。年份
结束年份=行[“结束日期”]。年份

return len(list)(filter(lambda year:start_year我收到这个错误
TypeError:“float”对象不能解释为整数
@SaiKiran-这意味着有一些缺少的值,如何工作
s=df.dropna().apply(func,axis=1)。重新索引(df.index,fill_value=False)
?@SaiKiran-答案已编辑。使用
df=df.dropna(子集=['Start\u date','End\u date'])
代码运行良好。我可以知道代码中年数的阈值在哪里吗?代码看起来有点难以理解。@SaiKiran-它在
范围(2005,2011)中指定
我收到此错误:
AttributeError:“Timestamp”对象没有属性“split”
添加了data.csv的内容。您从何处得到此错误?编辑后它现在正在工作。感谢您的努力。
Cities,Start_date,End_date,data_avail
A,1-03-2000,1-03-2012,12
B,1-12-2002,1-12-2005,3
C,1-04-2000,1-04-2010,10
D,1-04-2009,1-04-2016,7
E,1-04-2003,1-05-2007,5
  Cities Start_date   End_date  data_avail
0      A 2000-01-03 2012-01-03          12
2      C 2000-01-04 2010-01-04          10
4      E 2003-01-04 2007-01-05           5