我的问题与此类似,但我不确定如何修改列表中元素的最后一部分。
我想根据列名的开始方式将一个数据框拆分为更小的数据框。
例如,列名的格式为:
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
我能够得到唯一的PXs与: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
你可以做
d = dict(zip(df.columns,pd.factorize(df.columns.str.split('_').str[0])[0]+1))
dfs = {x : y for x , y in df.groupby(d,axis=1)}
dfs[1]
Out[657]:
P1_ATGC P1_GCTA
0 44 47
1 67 9
2 36 87
3 88 12
4 39 87
5 81 37
6 72 9
7 69 79
8 82 99
9 29 19
使用pd.DataFrame.filter
:
list_dfs = [df.filter(like=i) for i in df.columns.str.split('_').str[0]]
list_dfs[0]
和list_dfs[1]
:
P1_ATGC P1_GCTA
0 17 16
1 96 60
2 73 95
3 51 99
4 55 22
5 9 5
6 58 55
7 76 34
8 69 82
9 72 81
,
P2_AACT P2_CGAT
0 69 96
1 42 96
2 60 10
3 24 32
4 3 84
5 81 34
6 87 91
7 52 52
8 74 80
9 50 12
选项1
使用pd.DataFrame.filter
:
{i:df.filter(like=i) for i in df.columns.str.split('_').str[0]}
选项2
让我们通过使用groupby with axis=1对df.coulumns:
的字符串操作创建一个数据帧字典来进行尝试。dict_dfs = dict(tuple(df.groupby(df.columns.str.split('_').str[0], axis=1)))
dict_dfs['P1']
输出P1_ATGC P1_GCTA
0 17 16
1 96 60
2 73 95
3 51 99
4 55 22
5 9 5
6 58 55
7 76 34
8 69 82
9 72 81
,
dict_dfs['P2']
输出:
P2_AACT P2_CGAT
0 69 96
1 42 96
2 60 10
3 24 32
4 3 84
5 81 34
6 87 91
7 52 52
8 74 80
9 50 12