如何在数据框中搜索列表元素?

时间:2019-05-29 15:36:11

标签: python pandas if-statement

我有一个列表dates,其中日期作为字符串对象,日期从2003-01-01到2017-06-30:

['2003-01-01', '2003-01-02', '2003-01-03', '2003-01-04', '2003-01-05', '2003-01-06', '2003-01-07', '2003-01-08', '2003-01-09', '2003-01-10', '2003-01-11', '2003-01-12', '2003-01-13', '2003-01-14', '2003-01-15', '2003-01-16', '2003-01-17', '2003-01-18', '2003-01-19', '2003-01-20', '2003-01-21',...]

我有一个带有日期时间对象的数据框:

0       2013-01-09 09:07:49
1       2013-01-09 09:16:25
2       2013-01-09 11:14:28
3       2013-01-09 11:25:51
4       2013-01-09 11:25:51
5       2013-01-09 11:33:35
6       2013-01-09 11:35:31
7       2013-01-09 18:11:03
8       2013-03-13 21:04:58
9       2013-03-13 21:05:57
10      2013-03-15 14:07:27
11      2013-03-26 21:53:35
12      2013-03-26 22:19:20
13      2013-04-09 14:21:48
14      2013-04-09 14:22:29
15      2013-04-09 14:22:45
16      2013-04-22 12:10:47
...

然后我要检查列表dates中的日期是否在数据框中存在。所以我想做这样的事情:

df = pd.read_csv("blabla.csv")
df['time'] = pd.to_datetime(df['time'])
for j in dates:
  if j in df['time']:
       return(yes)

如何在数据框中比较字符串对象和日期时间对象?

这是我的完整代码:

dates=[]       
start = date(2003, 1, 1)
end = date(2017, 6, 30)

delta = end - start

for i in range(delta.days + 1):
    newdate = start + timedelta(days=i)
    dates.append(newdate.strftime("%Y-%m-%d"))

df = pd.read_csv("blabla.csv",parse_dates=True)
df['time'] = pd.to_datetime(df['time'])

2 个答案:

答案 0 :(得分:0)

您可以在对read_csv的调用中使用parse_dates

df = pd.read_csv("blabla.csv",parse_dates=True)

这将导致日期时间对象而不是字符串。然后,您可以使用.isin方法来查看一列的元素是否在另一列中。

df['time'].isin(dates)

这将为df ['time']中的每个值返回一系列True和False

答案 1 :(得分:0)

首先,我们将您的time列转换为日期时间,因此我们只能使用Series.dt.dates来访问日期。从您的日期时间中提取日期后,我们会将其转换为string,以便可以将其与您的列表进行比较。

最后,我们使用isin方法来创建新列作为指标。

df['Time'] = pd.to_datetime(df['Time'])

df['Indicator'] = df['Time'].dt.date.astype(str).isin(dates)

                  Time  Indicator
0  2013-01-09 09:07:49      False
1  2013-01-09 09:16:25      False
2  2013-01-09 11:14:28      False
3  2013-01-09 11:25:51      False
4  2013-01-09 11:25:51      False
5  2013-01-09 11:33:35      False
6  2013-01-09 11:35:31      False
7  2013-01-09 18:11:03      False
8  2013-03-13 21:04:58      False
9  2013-03-13 21:05:57      False
10 2013-03-15 14:07:27      False
11 2013-03-26 21:53:35      False
12 2013-03-26 22:19:20      False
13 2013-04-09 14:21:48      False
14 2013-04-09 14:22:29      False
15 2013-04-09 14:22:45      False
16 2013-04-22 12:10:47      False

注意:您的列表不是一个很好的例子,因为数据框中不存在任何日期,这就是为什么它返回所有False的原因。

如果我使用的列表中有具有日期的数据框,则其外观将如下所示:

dates = ['2013-01-09', '2013-02-09', '2013-03-26']
df['Indicator'] = df['Time'].dt.date.astype(str).isin(dates)

                  Time  Indicator
0  2013-01-09 09:07:49       True
1  2013-01-09 09:16:25       True
2  2013-01-09 11:14:28       True
3  2013-01-09 11:25:51       True
4  2013-01-09 11:25:51       True
5  2013-01-09 11:33:35       True
6  2013-01-09 11:35:31       True
7  2013-01-09 18:11:03       True
8  2013-03-13 21:04:58      False
9  2013-03-13 21:05:57      False
10 2013-03-15 14:07:27      False
11 2013-03-26 21:53:35       True
12 2013-03-26 22:19:20       True
13 2013-04-09 14:21:48      False
14 2013-04-09 14:22:29      False
15 2013-04-09 14:22:45      False
16 2013-04-22 12:10:47      False

有关isin的广泛信息:link