使用
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生成器理解问题。
答案 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