Сложный групповой панды данных - PullRequest
0 голосов
/ 12 марта 2019

У меня есть два фрейма данных: df_s_T и df_data_T и я хочу агрегировать (например, с помощью функции среднего агрегирования) второй на основе первого столбцовым способом,Вот что я имею в виду под примером:

ind = ['d1','d2','d3','d4']
my_data_ints = {'s1': [1, 2, 1, 2], 's2': [1, 2, 1, 1],'s3': [1, 1, 1, 1]}
df_s_T = pd.DataFrame(data=my_data_ints, index = ind).T
my_data = {'s1': [-1, 2, 5, 12], 's2': [-2, 2, 4, 10.5], 's3': [1, 2, 3, 4]}
df_data_T = pd.DataFrame(data=data, index = ind).T

, который можно визуализировать следующим образом:

print df_data_T
print df_s_T
     d1   d2   d3    d4
s1 -1.0  2.0  5.0  12.0
s2 -2.0  2.0  4.0  10.5
s3  1.0  2.0  3.0   4.0
    d1  d2  d3  d4
s1   1   2   1   2
s2   1   2   1   1
s3   1   1   1   1

Желаемый результат (вычисление среднего для каждого столбца для всех строк с равными значениями):

     d1   d2   d3     d4                    
1  -0.66  2.0  4.0   7.25
2   nan   2.0  nan  12.00

В моем примере для столбцов d1 и d3 значение строки 2 в желаемом выходном кадре данных равно nan, так как в «нет» значений «2»столбцы d1 и d3 в кадре данных df_s_T .

То, что я успешно выполнил, - это агрегирование по фиксированному столбцу (например, последний1), см. ниже

df_data_T_new = df_data_T.groupby(df_s_T.iloc[:,-1]).mean()
df_data_T_new
     d1   d2   d3     d4
d4                      
1  -0.5  2.0  3.5   7.25
2  -1.0  2.0  5.0  12.00

Я хочу создать умное решение, возможно, без написания циклов.Каким-то образом сначала нужно получить все возможные значения в df_data_T , чтобы правильно построить результирующий фрейм данных.

Заранее спасибо за предложения.

1 Ответ

2 голосов
/ 12 марта 2019

Возможно, подумайте об использовании zip и concat результата обратно

pd.concat([df1[x].groupby(df2[y]).mean() for x , y in zip(df1,df2)],axis=1)
Out[44]: 
          d1   d2   d3     d4
d4                           
1  -0.666667  2.0  4.0   7.25
2        NaN  2.0  NaN  12.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...