根据列 header 前缀拆分数据帧

Split dataFrames based on column header prefix

我有一个数据框,其中的列名称共享一个公共元素,生成的其他列带有该公共元素的后缀。我有大约 100 个条目的这些元素的列表。我想使用此列表对大型 df 进行迭代切片,通过分组转换 sub-df,并最终将它们连接在一起。

我正在考虑使用字典方法——使用列表作为键,然后将共享此元素的列定义为值。我不确定如何实施。我复制了一个简化版本来说明我想扩大规模。实际上,大约有 100 个键,每个键都有 20 个关联的列。

   A A_1 A_2 A_3  B B_1 B_2 B_3
0  1   e   f   g  1   x   y   z
1  2   e   f   g  2   x   y   z
2  3   e   f   g  3   x   y   z
3  3   e   f   g  3   x   y   z
4  3   e   f   g  4   x   y   z
5  3   e   f   g  4   x   y   z

df_list = ['A','B']

df_A = df[df.columns[df.columns.to_series().str.contains('A')]]

df_B = df[df.columns[df.columns.to_series().str.contains('B')]]

calc_A = df_A.groupby(['A']).head(1)
print(calc_A)

   A A_1 A_2 A_3
0  1   e   f   g
1  2   e   f   g
2  3   e   f   g


calc_B = df_B.groupby(['B']).head(1)
print(calc_B)

   B B_1 B_2 B_3
0  1   x   y   z
1  2   x   y   z
2  3   x   y   z
4  4   x   y   z

请告知如何构造此字典,遍历列表以对 df 进行切片并将共享键的列分配为新 sub-df 的值。谢谢你。

IIUC,可以对列前缀进行分组,然后初始化一个字典:

d = {}
for i, g in df.groupby(by=lambda x: x.split('_')[0], axis=1):
    d[i] = g.groupby(i).head(1)

您也可以使用 字典理解:

d = {
        i : g.groupby(i).head(1) 
        for (i, g) in df.groupby(by=lambda x: x.split('_')[0], axis=1)
}

for k, v in d.items():
    print(v, '\n')

   A A_1 A_2 A_3
0  1   e   f   g
1  2   e   f   g
2  3   e   f   g 

   B B_1 B_2 B_3
0  1   x   y   z
1  2   x   y   z
2  3   x   y   z
4  4   x   y   z 

d.keys()
dict_keys(['A', 'B'])