Как получить медианную строку за строкой? - PullRequest
0 голосов
/ 03 июля 2019

Я могу использовать группу, чтобы получить общие медианы для документа, например. "Печать (df.groupby ([ 'Key']). Медиана ())". Но я хочу изучить соответствующий способ сделать это построчно и посмотреть, изменилась ли вышеупомянутая группа. Ниже приведен один очень неуклюжий и непитонный подход.

CSV:

    A,1
    A,2
    A,3
    A,4
    A,5
    A,6
    A,7
    B,8
    B,9
    B,10
    B,11
    B,12
    B,13
    B,14
    B,15
    B,16
    B,17
import pandas as pd
import numpy as np
import statistics
df = pd.read_csv(r"C:\Users\mmcgown\Downloads\PythonMedianTest.csv",names=['Key','Values'])
rows = len(df.iloc[:,0])
i=0
med=[]
while i < rows:
    if i == 0 or df.iloc[(i-1,0)]==df.iloc[(i,0)]:
        med.append(df.iloc[i,1])
        if i==(rows-1):
            print(f"The median of {df.iloc[(i,0)]} is {statistics.median(med)}")
    elif df.iloc[(i-1,0)]!=df.iloc[(i,0)]:
        print(f"The median of {df.iloc[(i-1,0)]} is {statistics.median(med)}")
        med = []
    i += 1

Выход:

The median of A is 4
The median of B is 13

Я получаю то же самое, что и group by, за исключением ошибки округления. Но я хочу сделать это самым лаконичным, питонским способом, возможно, используя понимание списка.

1 Ответ

1 голос
/ 03 июля 2019

Предложение о более питонной версии может выглядеть следующим образом:

med=[]
rows, cols= df.shape
last_group=None
group_field='Key'
med_field='Values'
for i, row in df.iterrows():
    if last_group is None or last_group == row[group_field]:
        med.append(row[med_field])
    else:
        print(f"The median of {last_group} is {statistics.median(med)}")
        med = [row[med_field]]
    last_group= row[group_field]
if med:    
    print(f"The median of {last_group} is {statistics.median(med)}")

Я пытался избегать вызовов iloc с индексами, которые не так легко прочитать.Сначала я не понял, что вы сравниваете, если честно.Вам также не нужен elif в вашем случае.Вы можете просто использовать другое, потому что ваше условие - это просто отрицание части предложения if.Затем я узнал разницу в медиане, которую вычисляет ваша версия и мои вычисления.Если я не ошибаюсь, вы отбрасываете первое значение для B, верно?

И если вы хотите получить длину кадра данных, вы можете использовать:

rows, cols= df.shape

вместо того, чтобы звонить Лен.Я думаю, что читателю кода более очевидно, что он делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...