2016-07-11 6 views
0

Итак, я хочу взять среднее значение всех значений в столбце b, когда столбец a является частным, и постройте его с использованием Matplotlib.Среднее значение на основе критерия/условия Numpy Python

enter image description here

Таким образом, в приведенной выше таблице, я хочу, чтобы усреднить значения в В и Е для каждого же значения в А и, следовательно, создать новый элемент, где

A = 57 B = Avg всех значения Ь, где а = 57 E = Avg всех значений е, где а = 57 и так далее

и, наконец, сюжет нового элемента

Я пытался осуществить это, беря значения в другую матрицу идентичности но это не работает.

for x in list_of_entries: 
    Final['A'] = x; 
    Final['C'] = 0; 
    Final['D'] = 1; 
    I = np.logical_and((1), (data_temp['A'].astype(int) == x)) 
    Final['B'] = np.average(data_temp[I]['B']); 
    Final['E'] = np.average(data_temp[I]['E']); 
    np.empty(I); 
+0

Является 'data_temp' Pandas DataFrame? – unutbu

+0

Нет только массив numpy – DBB

+0

data_temp = np.genfromtxt (dir_readfile, dtype = float, delimiter = '\ t', names = names, usecols = [0,1,2,3,4,5], skip_header = 1) – DBB

ответ

2

С NumPy только, вы могли бы использовать np.unique(..., return_indx=True) найти индексы, которые разграничивают куски с постоянным A значения:

data_temp.sort(order=['A']) 
uniqs, idx = np.unique(data_temp['A'], return_index=True) 
idx = np.r_[idx, len(data_temp)] 
# >>> idx 
# array([ 0, 10, 20, 33, 42, 50, 58, 71, 79, 90, 100]) 

Затем вы можете получить доступ к ломтям data_temp с постоянной A значения, используя

data_temp[idx[i], idx[i+1]] 

для каждого i = 0,..., len(idx)-1.

Это быстрее, чем при использовании

for val in uniqs: 
    mask = data_temp['A'] == val 
    chunk = data_temp.loc[mask] 

потому, что доступ к основным ломтиков гораздо быстрее, чем передовые индексации с булевыми масок выделения.


import numpy as np 
import matplotlib.pyplot as plt 
np.random.seed(2016) 

data_temp = np.random.randint(10, size=(6*100)).view(
    [(col, '<i8')for col in list('ABCDEF')]) 
data_temp.sort(order=['A']) 
uniqs, idx = np.unique(data_temp['A'], return_index=True) 
idx = np.r_[idx, len(data_temp)] 

result = [] 
for i in range(len(idx)-1): 
    val = uniqs[i] 
    start, end = idx[i], idx[i+1] 
    # Uncomment to see the chunks of `data_temp` with constant A value 
    # print(data_temp[start:end]) 
    mean = {col:data_temp[col][start:end].mean() for col in ['B', 'E']} 
    result.append([val, mean['B'], 0, 1, mean['E']]) 
result = np.array(result) 
print(result) 

fig, ax = plt.subplots() 
ax.plot(result[:, 0], result[:, 1]) 
ax.plot(result[:, 0], result[:, 4]) 
plt.show() 

enter image description here


Если у вас есть Pandas, весь расчет становится невероятно просто:

import pandas as pd 
import matplotlib.pyplot as plt 
data_temp = pd.read_csv(dir_readfile, delimiter='\t', skiprows=1, names=names, 
    usecols=list(range(6))) 
fig, ax = plt.subplots() 
result = data_temp.groupby('A').agg({'B':'mean', 'E':'mean'}) 
result.plot() 
plt.show() 

enter image description here

+0

Кстати спасибо за код панды. Гораздо проще, чем только Numpy. – DBB

+0

Просто быстрое наблюдение. Предположим, что я хочу добавить еще одно условие, в котором я хочу, чтобы значения в B и E были уникальными для A и D, поэтому A = 57 и D = 0 означают B и означают C. Теперь я добавил еще один столбец в группу, и это кажется работать. Удивительно, как построить их, хотя A = 57 D = 0 один график, затем на том же графике A = 57 D = 1 и так далее. – DBB

+0

Возможно, вы ищете 'result = data_temp.groupby (['A', 'D']). Agg ({'B': 'mean', 'C': 'mean'})', но опять же я возможно, не понимаете вас должным образом. Если нет, отправьте новый вопрос, в котором будут показаны ввод образца и желаемый результат. – unutbu

Смежные вопросы