【问题标题】:How to summarize multiple logical flags in pandas如何在熊猫中总结多个逻辑标志
【发布时间】:2020-11-09 07:55:48
【问题描述】:

所有, 寻找一种简单的方法来做到这一点。我很确定 pd.groupby() 可能会帮助我实现这一目标,但我无法找到一个可行的示例。所以这就是我所拥有的:

import pandas as pd 
from random import sample 

# Build a random data set 
t = [2013] *12
t1 = [2014] * 12 
t.extend(t1)
list_of_years = t
list_of_months = list(range(1, 13)) * 2 
random_data = sample(range(1, 100), 24) 
data = zip(list_of_years, list_of_months, random_data) 
my_df = pd.DataFrame(data=data, columns=["Year", "Month", "RandomNumbers"]) 
my_df["test"] = my_df["RandomNumbers"] < 75 
my_df["test1"] = my_df["RandomNumbers"] < 50 

因此,在上面的示例中,我有两个布尔值计算每个月,为期两年。我想要得到的是一个新列,其中布尔值被组装为每个唯一月份的列表。我感到困惑的是 - 如何在不聚合的情况下将这些数据重组为新列。

期望的输出(示例):

Month All_Tests
1     [True, False]
2     [False, False] 
3     [False, False]
4     [False, True]
5     [True, True]
6     [True, False]
7     [True, False]
8     [False, False] 
9     [False, True]
10    [False, True]
11    [False, True]
12    [False, True]

提前感谢您的帮助

【问题讨论】:

  • 有 2 年和 2 个布尔列。为什么输出中只有 2 个布尔值,而不是 4 如果没有聚合?您是否只需要处理一列,例如test ?或者test1 的列缺少All_Tests 之类的列表?

标签: python python-3.x pandas aggregate pandas-groupby


【解决方案1】:

使用seed 测试相同测试数据的示例数据:

np.random.seed(2020)
import pandas as pd 

# Build a random data set 
t = [2013] *12
t1 = [2014] * 12 
t.extend(t1)
list_of_years = t
list_of_months = list(range(1, 13)) * 2 
random_data = np.random.randint(1, 100, size=24) 
data = zip(list_of_years, list_of_months, random_data) 
my_df = pd.DataFrame(data=data, columns=["Year", "Month", "RandomNumbers"]) 
my_df["test"] = my_df["RandomNumbers"] < 75 
my_df["test1"] = my_df["RandomNumbers"] < 50 
print (my_df)
    Year  Month  RandomNumbers   test  test1
0   2013      1             97  False  False
1   2013      2              9   True   True
2   2013      3             68   True  False
3   2013      4             68   True  False
4   2013      5             92  False  False
5   2013      6              4   True   True
6   2013      7             72   True  False
7   2013      8             57   True  False
8   2013      9             30   True   True
9   2013     10             49   True   True
10  2013     11             33   True   True
11  2013     12             25   True   True
12  2014      1             75  False  False
13  2014      2             10   True   True
14  2014      3             52   True  False
15  2014      4             12   True   True
16  2014      5             56   True  False
17  2014      6             63   True  False
18  2014      7             68   True  False
19  2014      8             70   True  False
20  2014      9             49   True   True
21  2014     10             29   True   True
22  2014     11             21   True   True
23  2014     12              9   True   True

如果多年只需要处理一列:

df1 = my_df.groupby('Month')['test'].agg(list).reset_index(name='All_Tests')
print (df1)  
    Month       All_Tests
0       1  [False, False]
1       2    [True, True]
2       3    [True, True]
3       4    [True, True]
4       5   [False, True]
5       6    [True, True]
6       7    [True, True]
7       8    [True, True]
8       9    [True, True]
9      10    [True, True]
10     11    [True, True]
11     12    [True, True]

如果需要每年测试至少一个True,然后将输出转换为列表:

df2 = my_df.filter(like='test').groupby(my_df['Month']).any().apply(list, 1).reset_index(name='All_Tests')
print (df2) 
    Month       All_Tests
0       1  [False, False]
1       2    [True, True]
2       3   [True, False]
3       4    [True, True]
4       5   [True, False]
5       6    [True, True]
6       7   [True, False]
7       8   [True, False]
8       9    [True, True]
9      10    [True, True]
10     11    [True, True]
11     12    [True, True]

用于将所有测试列转换为列表:

df3 = my_df.filter(like='test').groupby(my_df['Month']).agg(list).reset_index()
print (df3) 
    Month            test           test1
0       1  [False, False]  [False, False]
1       2    [True, True]    [True, True]
2       3    [True, True]  [False, False]
3       4    [True, True]   [False, True]
4       5   [False, True]  [False, False]
5       6    [True, True]   [True, False]
6       7    [True, True]  [False, False]
7       8    [True, True]  [False, False]
8       9    [True, True]    [True, True]
9      10    [True, True]    [True, True]
10     11    [True, True]    [True, True]
11     12    [True, True]    [True, True]

【讨论】:

    猜你喜欢
    • 2019-06-06
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2017-02-23
    • 2013-07-01
    • 2018-05-14
    相关资源
    最近更新 更多