从数据帧列创建索引

2024-05-29 07:16:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧(其中'ID'是索引的名称):

                      VAF
ID  
chr1-115227855-T-A  0.002491
chr1-115227855-T-C  0.005449
chr1-115227856-C-A  0.000466
chr1-115227856-C-G  0.000311
chr1-115227856-C-T  0.002331

第二个数据帧如下所示:

    Chrom   Loc WT  Var Change  ConvChange  AO  DP  VAF IntEx   Gene    Upstream    Downstream  Individual
0   chr1    115227855   T   C   T>C T>C 43  16155   0.00266171  TIII    TIIIa   NaN NaN 1
1   chr1    115227856   C   T   C>T C>T 25  16179   0.00154521  TIII    TIIIa   NaN NaN 1
2   chr1    115227857   C   T   C>T C>T 20  16178   0.00123625  TIII    TIIIa   NaN NaN 1
3   chr1    115227858   A   T   A>T T>A 29  16178   0.00179256  TIII    TIIIa   NaN NaN 1
4   chr1    115227880   C   T   C>T C>T 18  16150   0.00111455  TIII    TIIIa   NaN NaN 1

我想让第二个数据帧看起来像第一个。我尝试过这样设置一个新索引:

df2.set_index(['Chrom','Loc','WT','Var']).VAF

但这只是给了我一个多索引的数据帧。你知道吗

有办法吗?你知道吗


Tags: 数据名称idvarnanchangelocchr1
2条回答

apply一个format_map

fmt = '{Chrom}-{Loc}-{WT}-{Var}'.format_map
df[['VAF']].set_index(df.apply(fmt, 1).rename('ID'))

                         VAF
ID                          
chr1-115227855-T-C  0.002662
chr1-115227856-C-T  0.001545
chr1-115227857-C-T  0.001236
chr1-115227858-A-T  0.001793
chr1-115227880-C-T  0.001115

一行

因为它很酷¯\_(ツ)_/¯

df[['VAF']].set_index(df.apply('{Chrom}-{Loc}-{WT}-{Var}'.format_map, 1).rename('ID'))

解释

创建一个接受字典并传递其键:值对作为要在格式化字符串中使用的参数。注意,'Loc'可以是strint,因为format/format_map使用字符串表示。你知道吗

fmt = '{Chrom}-{Loc}-{WT}-{Var}'.format_map

通过使用df.applyaxis=1将函数应用于df的每一行,生成一个新的series对象。在这种情况下,每一行都将作为pandas.Series传递,并且可以在字典上下文中进行处理。这是format_map的最佳选择。我将把序列重命名为'ID',以匹配OP的输出。你知道吗

idx = df.apply(fmt, 1).rename('ID')

现在,如果我们在set_index中使用pandas.Series,Pandas会将现有索引与传递序列的索引对齐。。。这很好。你知道吗

使用方括号对列[['VAF']]进行切片,以确保保持列等于['VAF']的数据帧。否则,如果我们使用df['VAF'],我们将返回一个名为'VAF'的series对象。另外,pandas.Series没有set_index方法,pandas.DataFrame有。你知道吗

df[['VAF']].set_index(idx)

                         VAF
ID                          
chr1-115227855-T-C  0.002662
chr1-115227856-C-T  0.001545
chr1-115227857-C-T  0.001236
chr1-115227858-A-T  0.001793
chr1-115227880-C-T  0.001115

我们本可以这样做得到一个系列

df.set_index(idx)['VAF']

ID
chr1-115227855-T-C    0.002662
chr1-115227856-C-T    0.001545
chr1-115227857-C-T    0.001236
chr1-115227858-A-T    0.001793
chr1-115227880-C-T    0.001115
Name: VAF, dtype: float64

看!相同的数据,但现在是一个名为'VAF'的序列

首先将列连接到Series^{},将索引名更改为^{},然后将列VAF选择为一列DataFrame

s = df['Chrom'] + '-' + df['Loc'].astype(str) + '-' +  df['WT'] + '-' + df['Var']

df1 = df.set_index(s).rename_axis('ID')[['VAF']]
print (df1)
                         VAF
ID                          
chr1-115227855-T-C  0.002662
chr1-115227856-C-T  0.001545
chr1-115227857-C-T  0.001236
chr1-115227858-A-T  0.001793
chr1-115227880-C-T  0.001115

相关问题 更多 >

    热门问题