如何对列名的一部分进行分组,并聚合平均值?
How to groupby part of a column name, and aggregate mean?
我可以取两列的平均值,return 将其作为一个新列,但我不知道如何按照原始数据所具有的特定约定对所有列执行此操作。目标是平均 A1 & D1, ..., A12 & D12 等..
我尝试了以下内容的不同迭代,但如果我不指定确切的列,它就不起作用...
import pandas as pd
df = pd.DataFrame({'Time': [0.1, 0.2, 0.3],
'A1': [1000, 2000, 3000],
'A12': [1000, 2000, 3000],
'B1': [4000, 5000, 6000],
'B12': [4000, 5000, 6000],
'D1': [40000, 50000, 42000],
'D12': [40000, 50000, 42000]})
for column in d.columns:
if column.startswith('A') and column.startswith('D'):
d= (d[['A1', 'D1']].iloc[:].mean(axis=1))
- 如评论中所述,
column.startswith('A') and column.startswith('D')
永远不会成立。
- 评论中的解决方案很接近,但切片位置不正确,并且是所有列的平均值,而不仅仅是
A
和D
。
[1:]
在第一个字符之后开始切片(例如 A1[1:]
是 1
)
- Real Python: String Indexing
- 创建一个 Boolean mask with
pandas.Series.str.contains
以仅查找感兴趣的列,在本例中为 A
和 D
。
使用 .contains
,因为它识别正则表达式模式,而 .startswith
不识别。
- 仅对所需的列执行
.groupby
df[cols].groupby(df[cols].columns.str[1:], axis=1)
# select columns with A or D
cols = df.columns[df.columns.str.contains('A|D')]
dfm = df.join(df[cols].groupby(df[cols].columns.str[1:], axis=1).mean().astype(float).add_prefix('AD_mean_'))
Time A1 A12 B1 B12 D1 D12 AD_mean_1 AD_mean_12
0 0.1 1000 1000 4000 4000 40000 40000 20500.0 20500.0
1 0.2 2000 2000 5000 5000 50000 50000 26000.0 26000.0
2 0.3 3000 3000 6000 6000 42000 42000 22500.0 22500.0
我可以取两列的平均值,return 将其作为一个新列,但我不知道如何按照原始数据所具有的特定约定对所有列执行此操作。目标是平均 A1 & D1, ..., A12 & D12 等..
我尝试了以下内容的不同迭代,但如果我不指定确切的列,它就不起作用...
import pandas as pd
df = pd.DataFrame({'Time': [0.1, 0.2, 0.3],
'A1': [1000, 2000, 3000],
'A12': [1000, 2000, 3000],
'B1': [4000, 5000, 6000],
'B12': [4000, 5000, 6000],
'D1': [40000, 50000, 42000],
'D12': [40000, 50000, 42000]})
for column in d.columns:
if column.startswith('A') and column.startswith('D'):
d= (d[['A1', 'D1']].iloc[:].mean(axis=1))
- 如评论中所述,
column.startswith('A') and column.startswith('D')
永远不会成立。 - 评论中的解决方案很接近,但切片位置不正确,并且是所有列的平均值,而不仅仅是
A
和D
。 [1:]
在第一个字符之后开始切片(例如A1[1:]
是1
)- Real Python: String Indexing
- 创建一个 Boolean mask with
pandas.Series.str.contains
以仅查找感兴趣的列,在本例中为A
和D
。-
使用
.contains
,因为它识别正则表达式模式,而.startswith
不识别。
- 仅对所需的列执行
.groupby
df[cols].groupby(df[cols].columns.str[1:], axis=1)
# select columns with A or D
cols = df.columns[df.columns.str.contains('A|D')]
dfm = df.join(df[cols].groupby(df[cols].columns.str[1:], axis=1).mean().astype(float).add_prefix('AD_mean_'))
Time A1 A12 B1 B12 D1 D12 AD_mean_1 AD_mean_12
0 0.1 1000 1000 4000 4000 40000 40000 20500.0 20500.0
1 0.2 2000 2000 5000 5000 50000 50000 26000.0 26000.0
2 0.3 3000 3000 6000 6000 42000 42000 22500.0 22500.0