我有以下格式的多个excel文件(每个文件都跟踪不同的内容,即不同的'活动'标题):
| Name | Activity1 | Activity2 | Activity3 | Activity4 |
Timmy 2016-04-01 2016-12-30 2016-01-14 2016-03-04
John 2016-01-01 2016-12-12 2016-05-14 2016-11-02
Paul 2016-05-11 2016-04-17 2016-04-19 2015-07-02
...等
我正在尝试迭代指定文件夹中的所有文件 - 转换为Pandas数据帧 - 然后处理文件以生成报告 - 显示“名称”并返回任何具有日期之前的单元格的值当前日期,如果存在'冒犯'单元格则保持标题(对于可读性)。示例输出看起来像:
| Name | Activity1 | Activity3 | Activity4 |
Timmy empty cell? 2016-01-14 2016-03-04
John 2016-01-01 2016-04-19 2015-07-02
Paul和df ['Activity2']缺席,因为他们在当前日期之前没有单元格值。
我一直有问题返回特定单元格以获取输出我正在寻找,但是,我想我已经能够过滤整行,如果行中的单元格满足上述条件。我会粘贴下面的代码;如果你看到一些可怕的做法,请随时通过任何其他一般建议。我是自学成才,所以我只能假设我不尽可能地做事。
...省略函数传递/设置内容并直接进入过滤部分:
current_date = '{0:%Y-%m-%d}'.format(datetime.datetime.now())
output = dataframe[
(dataframe['Flu Shot'] < current_date) | (dataframe['PHA'] < current_date) | (dataframe['Dental'] < current_date) | (dataframe['HIV'] < current_date)
]
如果单元格具有指定的条件,这将返回ENTIRE行,但是,我仍然得到我不关心的单元格值。对于非常冗长的条件检查我并不是很疯狂 - 但这是我唯一可以开始工作的事情。
我也尝试过类似下面的代码 - 但无法让它正常工作,并且被告知使用pandas数据帧是一种非常糟糕的方式:
headers = list(dataframe.columns.values)
for header in headers[1:4]: # index 0 being 'Name'
frame = "'{}'".format(header)
if frame == 'Name':
continue
elif dataframe[frame] < current_date:
output.concat(dataframe.iloc[['Name', frame]])
else:
continue
答案 0 :(得分:0)
对于过滤,您可以一次性进行比较,您不必单独指定每个列:
In [20]: df[df > current_date]
Out[20]:
Name Activity1 Activity2 Activity3 Activity4
0 Timmy 2016-04-01 2016-12-30 NaN NaN
1 John NaN 2016-12-12 2016-05-14 2016-11-02
2 Paul 2016-05-11 2016-04-17 2016-04-19 NaN