2017-02-16 3 views
1

Я хочу рассчитать среднее время для последовательностей AD-VV-DD и AD-MM-PP. Эта последовательность может отображаться в любых столбцах MD_*. Для вычисления среднего времени, столбцы TIME_* следует использовать:Как рассчитать средние значения по различным столбцам?

df = 
MD_1 MD_2 MD_3 MD_4 MD_5 TIME_1 TIME_2 TIME_3 TIME_4 TIME_5 
NaN AD  VV  DD  NaN NaN  3  2  1  NaN 
AD  VV  DD  NaN NaN 1  1  1  NaN  NaN 
AD  MM  PP  NaN NaN 4  3  3  NaN  NaN 
TT  AD  MM  NaN NaN 2  4  NaN  NaN  NaN  

Результат должен быть такой:

result = 
MD_1_new MD_2_new MD_3_new TIME_1_new TIME_2_new TIME_3_new 
AD   VV   DD   2   1.5   1 
AD   MM   PP   4   3   3 

The TIME_* столбцы первой строки были вычислены следующим образом: в df есть два последовательности AD-VV-DD. Столбцы TIME_X выбираются на основе значений X в MD_X.

Это то, что я пытался, но как рассчитать средние значения соответствующих TIME_*:

def calculate_mean_times(df): 
    # Create drop rows 
    drop_rows = [] 
    index = 0 
    for index, x in df.iterrows(): 
     row = x.dropna() 
     if ((row[0] == 'AD') & (row[1] == 'VV') & (row[2] == 'DD')): 
      drop_rows.append(index) 
     index = index + 1 
    return drop_rows 

# Drop the rows in list 
correct_rows = calculate_mean_times(df) 
df = df.loc[correct_rows,:] 
+0

Пробовали ли вы что-нибудь? Какой результат вы получили? – Vaishali

+0

@VaishaliGarg См. Мое обновление. – user7379562

ответ

1

Вот код, чтобы удовлетворить ваши требования. Основной принцип организации заключается в создании tuple для каждого ключа, который нам нужно найти, а затем построить dict с этими ключами. Для каждой строки в кадре данных проверьте наличие ключа в каждом из трех возможных местоположений. Проверьте, отображается ли ключ в словаре. Если они есть, сохраните выровненные значения данных для последующего усреднения.

Код:

# build a dict with tuple keys for the results 
matches = { 
    ('AD', 'VV', 'DD'): [], 
    ('AD', 'MM', 'PP'): [], 
} 

# for each row check for key matches 
for i, row in df.iterrows(): 
    keys = tuple(row.values[0:5]) 
    for j in range(3): 
     try: 
      # check if these three columns match one of our tuple keys 
      # if it matches append the three columns of data 
      matches[tuple(keys[j:j+3])].append(
       row.values[5+j:8+j].astype(int)) 
      break 
     except KeyError: 
      pass 

# average the data 
avg = {} 
for k, v in matches.items(): 
    avg[k] = sum(v)/float(len(v)) 
print(avg) 

Тестовые данные:

data = [x.strip().split() for x in """ 
    MD_1 MD_2 MD_3 MD_4 MD_5 TIME_1 TIME_2 TIME_3 TIME_4 TIME_5 
    NaN AD  VV  DD  NaN NaN  3  2  1  NaN 
    AD  VV  DD  NaN NaN 1  1  1  NaN  NaN 
    AD  MM  PP  NaN NaN 4  3  3  NaN  NaN 
    TT  AD  MM  NaN NaN 2  4  NaN  NaN  NaN 
""".split('\n')[1:-1]] 
df = pd.DataFrame(data[1:], columns=data[0]) 

Выход:

{('AD', 'VV', 'DD'): array([ 2. , 1.5, 1. ]), ('AD', 'MM', 'PP'): array([ 4., 3., 3.])} 
Смежные вопросы