Как отсортировать матрицу по двум независимым столбцам? - PullRequest
0 голосов
/ 21 ноября 2018

Я недавно начал программировать, и мне было поручено найти среднее значение различных реакций лекарственного средства на основе его дозировки в сравнении с плацебо.У меня есть 4-колоночный файл Excel, который разбит на Drug_1_Dosage, Drug_1_Response, Drug_2_Dosage, Drug_2_Response соответственно.

Я пытаюсь отсортировать эти значения в блокноте Jupyter, чтобы все случаи, где Drug_1_Dosage было 1-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 голосов
/ 28 ноября 2018

Вы знакомы с операцией 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 за предложение опубликовать сообщениемой комментарий как отдельный ответ)

...