使用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]