从pandas DataFrame列创建索引

The*_*man 2 python pandas

我有一个看起来像这样的DataFrame(其中'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
Run Code Online (Sandbox Code Playgroud)

第二个DataFrame看起来像这样:

    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
Run Code Online (Sandbox Code Playgroud)

我想让第二个DataFrame看起来像第一个.我试过像这样设置一个新索引:

df2.set_index(['Chrom','Loc','WT','Var']).VAF
Run Code Online (Sandbox Code Playgroud)

但这只是给我一个多索引的DataFrame.

有没有办法做到这一点?

piR*_*red 5

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
Run Code Online (Sandbox Code Playgroud)

一条线

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

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

说明

创建一个函数,该函数接受字典并将其键:值对作为参数传递给格式化字符串.注意,'Loc'可以是strintformat/ format_map使用字符串表示.

fmt = '{Chrom}-{Loc}-{WT}-{Var}'.format_map
Run Code Online (Sandbox Code Playgroud)

通过应用功能的每一行作出了一系列新的对象df使用df.applyaxis=1.在这种情况下,每行将作为a传递pandas.Series,并可在字典上下文中处理.那是完美的format_map.我最终将系列重命名'ID'为匹配OP的输出.

idx = df.apply(fmt, 1).rename('ID')
Run Code Online (Sandbox Code Playgroud)

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

使用双方括号对列进行切片,[['VAF']]以确保我们保持数据框的列数等于['VAF'].否则,如果我们使用,df['VAF']我们将返回一个名称为的系列对象'VAF'.此外,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
Run Code Online (Sandbox Code Playgroud)

我们本可以做到这一点来获得一系列

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
Run Code Online (Sandbox Code Playgroud)

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