如何通过两个独立列对矩阵排序?

时间:2018-11-21 19:10:09

标签: python columnsorting

我最近开始编程,我的任务是根据药物相对于安慰剂的剂量查找药物不同反应的平均值。我有一个4列Excel文件,该文件分别分为Drug_1_DosageDrug_1_ResponseDrug_2_DosageDrug_2_Response

我正在尝试在Jupyter笔记本中对这些值进行排序,以便以递增的方式对Drug_1_Dosage1-8的所有实例进行响应排序(剂量为1的行超过1行例如),同时也对Drug_2_Dosage做同样的操作(但不影响第一个)。

我想对它们进行排序,以便以后可以计算平均值并将其表示为两列矩阵。

到目前为止,我有这个:

import numpy as np
import pandas as pd

file = open('/Users/Envy/Desktop/Assingment Data.csv',"r")
table = pd.read_csv('/Users/Envy/Desktop/Assingment Data.csv')
drug_1_d = table.iloc[:,0]
drug_1_r = table.iloc[:,1]
drug_2_d = table.iloc[:,2]
drug_2_r = table.iloc[:,3]

到目前为止,一切正常,因为我可以独立选择每一列。我尝试了以下操作以使排序不成功:

1) table = table.sort_values(['Dose drug 1', 'Dose drug 1'],ascending = True)
   table = pd.DataFrame.as_matrix(table)
   table = table[table[:,0].argsort()]
2) table.sort(order=['f1'],axis=0)
3) table.sort_values(['Dose drug 1', 'Dose drug 2'], ascending=[True])
4) table = table.sort_values([:0,:2],ascending=[True]) 

编辑:

嘿,我做了一些探索,并且可以使用上面的代码

table = table.sort_values(['Dose drug 1', 'Dose drug 1'],ascending = True)
table = pd.DataFrame.as_matrix(table) 
print(table) 

但是它返回

[[ 1 21  3 27]
 [ 1 19  7 10]
 [ 1 32  3 12]
 ...
 [ 8 18  4 24]
 [ 8  9  1 10]
 [ 8 13  2  9]]

意思是它也只按列0排序而不按列2排序,就像我想要的那样。知道我如何可以同时进行两种排序吗?

编辑:经过反复尝试,我现在有了解决方案;

#Generate average response to dosage in 2 column matrix
table = pd.read_csv('Assingment Data.csv', sep=',')
final_means = pd.DataFrame()
# Grouping by Drug 1
final_means['Average Response Drug'] = table.groupby(['Dose drug 1'])['Response drug 1'].mean()
# Grouping by Drug 2
final_means['Average Response Placebo'] = table.groupby(['Dose drug 2'])['Response drug 2'].mean()
final_means.index.names = ['Dose']
print(final_means)

1 个答案:

答案 0 :(得分:0)

您是否熟悉Pandas的groupby操作?这使您可以对每个组进行推理,而不必对表进行显式排序

一个简单的例子:

>>> import pandas as pd
>>> df = pd.DataFrame(data={'col1': [0,0,1,1], 'col2': [1,2,3,4]})
>>> df
   col1  col2
0     0     1
1     0     2
2     1     3
3     1     4
>>> df.groupby('col1').mean()
      col2
col1
0      1.5
1      3.5

(感谢@Sean-Pianka建议我将评论发布为单独的答案)