首页 > 解决方案 > 如何根据另一列的值对一列进行pandas-groupby并获得每组的特定结果?

问题描述

我有一个包含两列的 DataFrame:一列是日期,另一列包含值 True 或 False。

假设此代码获取数据框:

d_range=pd.date_range(start='01-01-2018', end='01-06-2018', freq='0.2D', )
d_range=d_range.date
my_list=[]
for i in range(0,d_range.size):
    if 0<i<18:
       my_list.append(False)
    else:
       my_list.append(True)

df=pd.DataFrame({'date':d_range, 'met criteria':my_list})
df.set_index(['date'])

这将为我们提供这个 DataFrame:

print(df)

    date            criteria
0   2018-01-01          True
1   2018-01-01         False
2   2018-01-01         False
3   2018-01-01         False
4   2018-01-01         False
5   2018-01-02         False
6   2018-01-02         False
7   2018-01-02         False
8   2018-01-02         False
9   2018-01-02         False
10  2018-01-03         False
11  2018-01-03         False
12  2018-01-03         False
13  2018-01-03         False
14  2018-01-03         False
15  2018-01-04         False
16  2018-01-04         False
17  2018-01-04         False
18  2018-01-04          True
19  2018-01-04          True
20  2018-01-05          True
21  2018-01-05          True
22  2018-01-05          True
23  2018-01-05          True
24  2018-01-05          True
25  2018-01-06          True

我需要一个按“日期”分组的结果,如果至少有一个 True 值,那么结果将为 True,否则为 False。结果应如下所示:

      date      criteria
2018-01-01          True
2018-01-02         False
2018-01-03         False
2018-01-04          True
2018-01-05          True
2018-01-06          True

你能建议一些可以做到这一点的代码吗?

标签: python-3.xpandasdataframegroup-by

解决方案


这是一种方法:

In [1]:
import pandas as pd

d_range=pd.date_range(start='01-01-2018', end='01-06-2018', freq='0.2D', )
d_range=d_range.date
my_list=[]
for i in range(0,d_range.size):
    if 0<i<18:
       my_list.append(False)
    else:
       my_list.append(True)

df=pd.DataFrame({'date':d_range, 'met criteria':my_list})

def True_or_Not(x):
    return x>0
df.groupby('date').sum().apply(True_or_Not)
df

Out [1]:
            met criteria
date    
2018-01-01  True
2018-01-02  False
2018-01-03  False
2018-01-04  True
2018-01-05  True
2018-01-06  True

推荐阅读