根据条件删除元组元素

时间:2020-08-25 05:55:40

标签: python pandas numpy date math

具有DST值的数据框:

data0 = pd.DataFrame({'DST':[33,11,-52,7,80,34,41,68,-87],'Date':['1975-01-03','1975-01-04','1975-01-07','1975-01-08','1975-01-13','1975-01-14','1975-01-15','1975-02-01','1975-02-03']})
data0
    DST       Date
0   33  1975-01-03
1   11  1975-01-04
2  -52  1975-01-07
3    7  1975-01-08
4   80  1975-01-13
5   34  1975-01-14
6   41  1975-01-15
7   68  1975-02-01
8  -87  1975-02-03

我有故事集

combined_date = [('1975-01-03', '1975-01-06'),('1975-01-13', '1975-01-15'),
                 ('1975-01-31', '1975-02-02'),('1975-02-03', '1975-02-13')]

问题: 如果DST在元组中的那些日期之间低于-50,则必须删除元组元素。 我尝试了代码:

for i in len(data0):
    if data0['DST'][i]<-50:
        del (j for j in combined_date if data0['DATE'][i]>=j[0] and data0['DATE'][i]<=j[1])

预期输出:

('1975-01-03', '1975-01-06'),('1975-01-13', '1975-01-15'),
('1975-01-31', '1975-02-02')

发生错误:无法删除生成器表达式。

注意

如果DST低于-50,则必须删除该元组!

2 个答案:

答案 0 :(得分:1)

首先按boolean indexing中的条件过滤行:

data0['Date'] = pd.to_datetime(data0['Date'])
df = data0[data0['DST']<-50]
print (df)
   DST       Date
3  -67 1975-01-07
4  -80 1975-01-15

然后使用Series.betweenSeries.any删除列表理解中的元组值:

out = [j  for j in combined_date if not df['Date'].between(j[0], j[1]).any()]
print (out)

答案 1 :(得分:1)

从解析器的角度查看代码:

del (j for j in combined_date if ...)

括号括起一个生成器。删除生成器表达式是什么意思?

想要要做的是删除列表中的元素。在大多数应用程序中,最有效的方法是翻转逻辑并保持所需的元素。而不是删除...

kept_date = [j for j in combined_date if ...]

你能从那里拿走吗?

相关问题