通过对现有列进行分组和操作,在 pandas df 中创建新列
Create new columns in pandas df by grouping and performing operations on an existing column
我有一个看起来像这样的数据框(最小可重现示例)
thermometers = ['T-10000_0001', 'T-10000_0002','T-10000_0003', 'T-10000_0004',
'T-10001_0001', 'T-10001_0002', 'T-10001_0003', 'T-10001_0004',
'T-10002_0001', 'T-10002_0003', 'T-10002_0003', 'T-10002_0004']
temperatures = [15.1, 14.9, 12.7, 10.8,
19.8, 18.3, 17.7, 18.1,
20.0, 16.4, 17.6, 19.3]
df_set = {'thermometers': thermometers,
'Temperatures': temperatures}
df = pd.DataFrame(df_set)
Index
Thermometer
Temperature
0
T-10000_0001
14.9
1
T-10000_0002
12.7
2
T-10000_0003
12.7
3
T-10000_0004
10.8
4
T-10001_0001
19.8
5
T-10001_0002
18.3
6
T-10001_0003
17.7
7
T-10001_0004
18.1
8
T-10002_0001
20.0
9
T-10002_0002
16.4
10
T-10002_0003
17.6
11
T-10002_0004
19.3
我正在尝试对温度计进行分组(即 'T-10000'、'T-10001'、'T-10002'),并使用每个温度计读数的最小值、最大值和平均值创建新列。所以我的最终数据框看起来像这样
Index
Thermometer
min_temp
average_temp
max_temp
0
T-10000
10.8
12.8
14.9
1
T-10001
17.7
18.5
19.8
2
T-10002
16.4
18.3
20.0
我尝试创建一个单独的函数,我认为它需要正则表达式,但我不知道该怎么做。任何帮助将不胜感激。
通过分隔符 _
来使用 groupby
。然后,只需聚合您需要的任何功能。
>>> df.groupby(df['thermometers']\
.str.split('_'). \
.str.get(0)).agg(['min', 'mean', 'max'])
min mean max
thermometers
T-10000 10.8 13.375 15.1
T-10001 17.7 18.475 19.8
T-10002 16.4 18.325 20.0
另一种使用 str.extract
的方法可以避免调用 str.get
:
(df['Temperatures']
.groupby(df['thermometers'].str.extract('(^[^_]+)', expand=False))
.agg(['min', 'mean'])
)
输出:
min mean
thermometers
T-10000 10.8 13.375
T-10001 17.7 18.475
T-10002 16.4 18.325
我有一个看起来像这样的数据框(最小可重现示例)
thermometers = ['T-10000_0001', 'T-10000_0002','T-10000_0003', 'T-10000_0004',
'T-10001_0001', 'T-10001_0002', 'T-10001_0003', 'T-10001_0004',
'T-10002_0001', 'T-10002_0003', 'T-10002_0003', 'T-10002_0004']
temperatures = [15.1, 14.9, 12.7, 10.8,
19.8, 18.3, 17.7, 18.1,
20.0, 16.4, 17.6, 19.3]
df_set = {'thermometers': thermometers,
'Temperatures': temperatures}
df = pd.DataFrame(df_set)
Index | Thermometer | Temperature |
---|---|---|
0 | T-10000_0001 | 14.9 |
1 | T-10000_0002 | 12.7 |
2 | T-10000_0003 | 12.7 |
3 | T-10000_0004 | 10.8 |
4 | T-10001_0001 | 19.8 |
5 | T-10001_0002 | 18.3 |
6 | T-10001_0003 | 17.7 |
7 | T-10001_0004 | 18.1 |
8 | T-10002_0001 | 20.0 |
9 | T-10002_0002 | 16.4 |
10 | T-10002_0003 | 17.6 |
11 | T-10002_0004 | 19.3 |
我正在尝试对温度计进行分组(即 'T-10000'、'T-10001'、'T-10002'),并使用每个温度计读数的最小值、最大值和平均值创建新列。所以我的最终数据框看起来像这样
Index | Thermometer | min_temp | average_temp | max_temp |
---|---|---|---|---|
0 | T-10000 | 10.8 | 12.8 | 14.9 |
1 | T-10001 | 17.7 | 18.5 | 19.8 |
2 | T-10002 | 16.4 | 18.3 | 20.0 |
我尝试创建一个单独的函数,我认为它需要正则表达式,但我不知道该怎么做。任何帮助将不胜感激。
通过分隔符 _
来使用 groupby
。然后,只需聚合您需要的任何功能。
>>> df.groupby(df['thermometers']\
.str.split('_'). \
.str.get(0)).agg(['min', 'mean', 'max'])
min mean max
thermometers
T-10000 10.8 13.375 15.1
T-10001 17.7 18.475 19.8
T-10002 16.4 18.325 20.0
另一种使用 str.extract
的方法可以避免调用 str.get
:
(df['Temperatures']
.groupby(df['thermometers'].str.extract('(^[^_]+)', expand=False))
.agg(['min', 'mean'])
)
输出:
min mean
thermometers
T-10000 10.8 13.375
T-10001 17.7 18.475
T-10002 16.4 18.325