我有一个看起来像这样的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。
有没有办法做到这一点?
答案 0 :(得分: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
因为很酷¯\_(ツ)_/¯
df[['VAF']].set_index(df.apply('{Chrom}-{Loc}-{WT}-{Var}'.format_map, 1).rename('ID'))
创建一个接受字典并将其key:value对作为参数传递给格式字符串的函数。请注意,'Loc'
可以是str
或int
,因为format
/ format_map
使用字符串表示形式。
fmt = '{Chrom}-{Loc}-{WT}-{Var}'.format_map
通过将函数df
与df.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)
首先将各列连接到Series
,set_index
,将索引名更改为rename_axis
,然后选择列VAF
,将字段[]
翻倍为一个列{{1 }}:
DataFrame