从pandas DataFrame列创建索引

时间:2018-08-10 17:43:53

标签: 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

还有另一个看起来像这样的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

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

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

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

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:5)

applyformat_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'))

说明

创建一个接受字典并将其key:value对作为参数传递给格式字符串的函数。请注意,'Loc'可以是strint,因为format / format_map使用字符串表示形式。

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

通过将函数dfdf.apply一起应用到axis=1的每一行来制作新的序列对象。在这种情况下,每一行将作为pandas.Series传递,并且可以在字典上下文中进行处理。这对于format_map是完美的。我将最终将该系列重命名为'ID',以匹配OP的输出。

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

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

使用 double 方括号对[['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

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

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'

答案 1 :(得分:3)

首先将各列连接到Seriesset_index,将索引名更改为rename_axis,然后选择列VAF,将字段[]翻倍为一个列{{1 }}:

DataFrame