【问题标题】:How to pandas-groupby a column and get a specific result per group depending on the values of another column?如何根据另一列的值对一列进行pandas-groupby并获得每组的特定结果?
【发布时间】:2019-08-23 13:58:06
【问题描述】:

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

假设这段代码获取Dataframe:

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

你能推荐一些可以做到这一点的代码吗?

【问题讨论】:

  • df.groupby('date').any()

标签: python-3.x pandas dataframe group-by


【解决方案1】:

这是一种方法:

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

【讨论】:

  • 谢谢!我听从了您的建议并尝试了以下方法: group_df=df.groupby(['date'])['met criteria'].sum().apply(lambda x: x>0)
【解决方案2】:

您可以在此使用isin 方法。基本上,使用 date 列中的唯一值过滤数据框,然后检查每个结果数据框是否存在于 criteria 列中。

根据结果填充字典,创建一个新的数据框,其column 1 值等于您的datescolumn 2 值等于来自your_dict 的映射布尔值

date_unique = list(set(df['date'].values.tolist()))
your_dict = {}

for d in date_unique:
    test_df = df[df['date'].isin([d])]
    if 'True' in test_df['criteria']:
        your_dict[d] = True
    else:
        your_dict[d] = False

output_df = pd.DataFrame()
output_df['date'] = date_unique
output_df['criteria'] = output_df['date'].map(your_dict)

请注意'True'True不同,python中一个是字符串,一个是bool数据类型。无论/如何阅读原始数据框中的 criteria 列,都应将正确的类型应用于循环内的条件。

【讨论】:

  • 我使用的是 True 而不是 'True',我不知道为什么......但这对我不起作用,即使我将 [date] 更正为 ['date'] 等. 在你的建议中。感谢您提到的 pandas-map 方法。
  • 循环内的date 是一个变量date 而不是字符串,字符串部分是您的DataFrame 中date column 的名称。抱歉造成混淆,正在编辑答案。
猜你喜欢
  • 2019-04-04
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2022-06-13
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多