我的问题类似于this但我不确定如何仅修改列表中元素的最后一部分。
我想根据列名称的开头方式将数据帧拆分为更小的数据帧。
例如,列名称的格式为:
df = pd.DataFrame(np.random.randint(0,100,size=(10, 4)))
df.columns = ['P1_ATGC', 'P1_GCTA', 'P2_AACT', 'P2_CGAT']
df
P1_ATGC P1_GCTA P2_AACT P2_CGAT
0 78 86 47 78
1 22 48 22 43
2 91 12 45 10
3 83 85 9 20
4 82 26 25 71
5 13 36 53 19
6 93 15 30 28
7 24 13 55 23
8 10 49 98 45
9 85 35 77 89
并希望最终为每个 PX 提供单独的 df。例如:
df[0]
P1_ATGC P1_GCTA
0 78 86
1 22 48
2 91 12
3 83 85
4 82 26
5 13 36
6 93 15
7 24 13
8 10 49
9 85 35
df[1]
P2_AACT P2_CGAT
0 47 78
1 22 43
2 45 10
3 9 20
4 25 71
5 53 19
6 30 28
7 55 23
8 98 45
9 77 89
我能够通过以下方式获取唯一的 PX:np.unique([x.split('_')[0] for x in df.columns])
它返回:
array(['P1', 'P2'], dtype='<U2')
但是如何根据数据帧所属的 PX 按列拆分数据帧?
最佳答案
使用pandas.DataFrame.groupby
的一种方法:
res = []
for k, d in df.groupby(df.columns.str.split("_").str[0], axis=1):
res.append(d)
print(d)
输出:
P1_ATGC P1_GCTA
0 78 86
1 22 48
2 91 12
3 83 85
4 82 26
5 13 36
6 93 15
7 24 13
8 10 49
9 85 35
P2_AACT P2_CGAT
0 47 78
1 22 43
2 45 10
3 9 20
4 25 71
5 53 19
6 30 28
7 55 23
8 98 45
9 77 89
关于python - 如果数据框以列表中的字符串开头,则按列名称拆分数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72625111/