Pandas:遍历列 index/labels 并将以相同字符串开头的列分组
Pandas: Iterate through columns index/labels and group the ones that starts with the same strings
我想对以相同 str 开头的列 index/labels 进行分组,但我不能使用 str.startswith(),因为如果我必须编写,它将是一个很长的列表每个前缀和组。
所以我想遍历每一列的前缀(格式为 Q[0-9])并将所有相似的前缀组合在一起。
带有一个前缀的示例:
Q1EXAMPLE Q1EXAMPLE1 Q2EXAMPLE2 Q2EXAMPLE3
f1 = [col for col in df if col.startswith('Q1')]
df[f1]
grouped = df.groupby(df.columns.str[:2], axis=1)
将按列名称的前两个字符对列进行分组。
- 对于select以正则表达式模式
Q[0-9]
开头的列,可以使用df.filter()
和regex=
参数,如下:
df2 = df.filter(regex=r'^Q[0-9]')
正则表达式元字符 ^
表示匹配的文本开头(列标签)
- 然后,要创建查找 table(以 Python 字典的形式)来查找每个 Qx 的结果,您可以使用字典理解来遍历 Pandas GroupBy objects of (groups of) column label prefixes by
.groupby()
on axis=1
on the column label prefixes, 如下:
Q_dict = {col_prefix: df_i for col_prefix, df_i in df2.groupby(df2.columns.str[:2], axis=1)}
演示
- 相关栏目选择:
data = {'Col_1': ['a1', 'b1'],
'Q1EXAMPLE': ['a2', 'b2'],
'T1Q1': ['a3', 'b3'],
'Q1EXAMPLE1': ['a4', 'b4'],
'T1_Q9': ['a5', 'b5'],
'Q2EXAMPLE2': ['a6', 'b6'],
'T2EXAMPLE2': ['a7', 'b7'],
'Q2EXAMPLE3': ['a8', 'b8'],
'Col_n': ['a9', 'b9']}
df = pd.DataFrame(data)
print(df)
Col_1 Q1EXAMPLE T1Q1 Q1EXAMPLE1 T1_Q9 Q2EXAMPLE2 T2EXAMPLE2 Q2EXAMPLE3 Col_n
0 a1 a2 a3 a4 a5 a6 a7 a8 a9
1 b1 b2 b3 b4 b5 b6 b7 b8 b9
df2 = df.filter(regex=r'^Q[0-9]')
print(df2)
Q1EXAMPLE Q1EXAMPLE1 Q2EXAMPLE2 Q2EXAMPLE3
0 a2 a4 a6 a8
1 b2 b4 b6 b8
- 使用
Q_dict
访问以特定前缀开头的列子集:
print(Q_dict['Q2'])
Q2EXAMPLE2 Q2EXAMPLE3
0 a6 a8
1 b6 b8
print(Q_dict['Q1'])
Q1EXAMPLE Q1EXAMPLE1
0 a2 a4
1 b2 b4
我想对以相同 str 开头的列 index/labels 进行分组,但我不能使用 str.startswith(),因为如果我必须编写,它将是一个很长的列表每个前缀和组。
所以我想遍历每一列的前缀(格式为 Q[0-9])并将所有相似的前缀组合在一起。
带有一个前缀的示例:
Q1EXAMPLE Q1EXAMPLE1 Q2EXAMPLE2 Q2EXAMPLE3
f1 = [col for col in df if col.startswith('Q1')]
df[f1]
grouped = df.groupby(df.columns.str[:2], axis=1)
将按列名称的前两个字符对列进行分组。
- 对于select以正则表达式模式
Q[0-9]
开头的列,可以使用df.filter()
和regex=
参数,如下:
df2 = df.filter(regex=r'^Q[0-9]')
正则表达式元字符 ^
表示匹配的文本开头(列标签)
- 然后,要创建查找 table(以 Python 字典的形式)来查找每个 Qx 的结果,您可以使用字典理解来遍历 Pandas GroupBy objects of (groups of) column label prefixes by
.groupby()
onaxis=1
on the column label prefixes, 如下:
Q_dict = {col_prefix: df_i for col_prefix, df_i in df2.groupby(df2.columns.str[:2], axis=1)}
演示
- 相关栏目选择:
data = {'Col_1': ['a1', 'b1'],
'Q1EXAMPLE': ['a2', 'b2'],
'T1Q1': ['a3', 'b3'],
'Q1EXAMPLE1': ['a4', 'b4'],
'T1_Q9': ['a5', 'b5'],
'Q2EXAMPLE2': ['a6', 'b6'],
'T2EXAMPLE2': ['a7', 'b7'],
'Q2EXAMPLE3': ['a8', 'b8'],
'Col_n': ['a9', 'b9']}
df = pd.DataFrame(data)
print(df)
Col_1 Q1EXAMPLE T1Q1 Q1EXAMPLE1 T1_Q9 Q2EXAMPLE2 T2EXAMPLE2 Q2EXAMPLE3 Col_n
0 a1 a2 a3 a4 a5 a6 a7 a8 a9
1 b1 b2 b3 b4 b5 b6 b7 b8 b9
df2 = df.filter(regex=r'^Q[0-9]')
print(df2)
Q1EXAMPLE Q1EXAMPLE1 Q2EXAMPLE2 Q2EXAMPLE3
0 a2 a4 a6 a8
1 b2 b4 b6 b8
- 使用
Q_dict
访问以特定前缀开头的列子集:
print(Q_dict['Q2'])
Q2EXAMPLE2 Q2EXAMPLE3
0 a6 a8
1 b6 b8
print(Q_dict['Q1'])
Q1EXAMPLE Q1EXAMPLE1
0 a2 a4
1 b2 b4