按列名称拆分数据框,如果它以列表中的字符串开头



我的问题与此类似,但我不确定如何修改列表中元素的最后一部分。

我想根据列名的开始方式将一个数据框拆分为更小的数据框。

例如,列名的格式为:

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

相关内容

  • 没有找到相关文章