将DataFrame行索引设置为其他列

时间:2015-07-28 05:38:24

标签: python matrix pandas

设置

使用

cell = pd.read_csv('test_cell.txt',header=2,sep='\t')

我创建了一个如下所示的pandas DataFrame对象:

           Name   Description  LN18  22RV1  DU145 
0  100009676_at  LOC100009676  1     2      3     
1      10000_at          AKT3  4     5      6    
2      10001_at          MED6  7     8      9  
3           NaN           NaN  NaN   NaN    NaN

我想用另一个具有相似行的矩阵做一些矩阵乘法(外积)。例如:

patients =
       id  Pat_1   Pat_2   Pat_3
    0          MED6    1   1   1
    1  LOC100009676    2   2   2
    2          ABCD    3   3   3

问题

这两个矩阵有一些相似的行名 - 基因符号。由于我熟悉使用键迭代字典,如何使用我的第一个pandas DataFrame cell建立一个“关键”列(第1列 - “描述”),使其与我的其他DataFrame {{1}匹配基因符号键?

最终:

我想在“MED6”,“LOC100009676”等上执行我的外部产品,并在每个患者中添加每个基因评分:细胞比较。最终的数据结构是9个条目的一维矩阵(如上所述给出两个3x3矩阵)。

patients

感谢用户@Ivc帮助我解决了dot_prod_total numpy生成器理解问题。

1 个答案:

答案 0 :(得分:1)

我想您想要做的是pd.merge基因名称,然后将每个细胞的得分相加:患者对。但是你的数据框被重新塑造了; pd.stack对此有用。

cell_s=cell.set_index(['Description','Name']).stack().reset_index()
cell_s.columns = ['Description', 'Name', 'cell', 's1']    

然后,cell_s看起来像这样:

    Description          Name   cell  s1
0  LOC100009676  100009676_at   LN18   1
1  LOC100009676  100009676_at  22RV1   2
2  LOC100009676  100009676_at  DU145   3
3          AKT3      10000_at   LN18   4
4          AKT3      10000_at  22RV1   5
5          AKT3      10000_at  DU145   6
6          MED6      10001_at   LN18   7
7          MED6      10001_at  22RV1   8
8          MED6      10001_at  DU145   9
....

为患者再做一次:

patients_s=patients.set_index('id').stack().reset_index()
patients_s.columns=['id', 'patient', 's2']

然后,加入两个和产品两个分数:

merged=cell_s.merge(patients_s, left_on='Description',right_on='id')
merged['score']=merged.s1*merged.s2

看起来像:

     Description          Name   cell  s1            id patient  s2  score
0   LOC100009676  100009676_at   LN18   1  LOC100009676   Pat_1   2      2
1   LOC100009676  100009676_at   LN18   1  LOC100009676   Pat_2   2      2
2   LOC100009676  100009676_at   LN18   1  LOC100009676   Pat_3   2      2
3   LOC100009676  100009676_at  22RV1   2  LOC100009676   Pat_1   2      4
4   LOC100009676  100009676_at  22RV1   2  LOC100009676   Pat_2   2      4
5   LOC100009676  100009676_at  22RV1   2  LOC100009676   Pat_3   2      4
6   LOC100009676  100009676_at  DU145   3  LOC100009676   Pat_1   2      6
...

最后,分组并总结得分:

scores=merged.groupby(['patient','cell'])['score'].sum()

你这样得scores

patient  cell 
Pat_1    22RV1    12
         DU145    15
         LN18      9
Pat_2    22RV1    12
         DU145    15
         LN18      9
Pat_3    22RV1    12
         DU145    15
         LN18      9

发表评论

为了将分数绘制为直方图,pandas具有hist()种方法。

scores = scores.reset_index()
#Plot a histogram with all scores:
scores.hist()
#Plot a histogram with specific cells:
cells = your_map['tissue_1']  #e.g. cells = ['LN18', 'DU145']    
scores[scores.cell.isin(cells)].hist()
#or get the score array and input this to your plotting functions
score_array = scores[scores.cell.isin(cells)].score.values