Pandas:仅过滤标题,第一个单元格值和单元格值:如果行中的单元格满足条件

时间:2016-03-10 21:15:07

标签: python pandas

我有以下格式的多个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

1 个答案:

答案 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