Итерация по нескольким фреймам данных и выполнение расчета на основе конкретного столбца - PullRequest
0 голосов
/ 01 июня 2018

У меня есть несколько фреймов данных, которые имеют месяцы в качестве столбцов и содержат целочисленные значения.Я публикую 2 для этого примера.

df1 =     
             June 2016       July 2016
Flavor
Vanilla      17.0            23.0
Chocolate    7.0             12.0
Strawberry   11.0            14.0

df2 =        
             June 2016       July 2016
Flavor
Vanilla      9.0            19.0
Chocolate    10.0           3.0

Как я могу выполнить итерацию по каждому фрейму данных и выполнить вычисления в зависимости от имени строки и столбца фрейма данных, когда они должны совпадать?Например, я хочу рассчитать среднее значение для Vanilla за июль, которое будет (23 + 19) / 2.Если Flavor также не существует в кадре данных, то я также хотел бы назначить постоянное значение (скажем, 15 в этом примере) в месяц в этом кадре данных.Могу ли я добавить кадры данных вместе, а затем применить .mean()?

Заранее спасибо, и извините за любую резкость, я сейчас в пути, путешествую.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Рассмотрим прямую векторизацию, поскольку вы можете выполнять арифметические операции над аналогичными структурированными фреймами данных:

(df1 + df2.reindex(labels=df1.index.values, fill_value=15)) / 2

#             June 2016  July 2016
# Flavor                          
# Vanilla          13.0       21.0
# Chocolate         8.5        7.5
# Strawberry       13.0       14.5

А для многих фреймов данных в списке рассмотрим reduce:

from functools import reduce

df_list = [df1, df2]
new_df_list = [d.reindex(labels=df1.index.values, fill_value=15) for d in df_list]

reduce(lambda x,y: x + y, new_df_list) / len(new_df_list)

#             June 2016  July 2016
# Flavor                          
# Vanilla          13.0       21.0
# Chocolate         8.5        7.5
# Strawberry       13.0       14.5

Данные

import pandas as pd
from io import StringIO

txt = '''             
Flavor      "June 2016"       "July 2016"
Vanilla      17.0            23.0
Chocolate    7.0             12.0
Strawberry   11.0            14.0'''

df1 = pd.read_table(StringIO(txt), sep="\s+", index_col=0)


txt = '''             
Flavor      "June 2016"       "July 2016"
Vanilla      9.0            19.0
Chocolate    10.0           3.0'''

df2 = pd.read_table(StringIO(txt), sep="\s+", index_col=0)
0 голосов
/ 01 июня 2018

Использование groupby со столбцами

pd.concat([df1,df2],1).fillna(15).groupby(level=0,axis=1).mean()
Out[408]: 
            July2016  June2016
Chocolate        7.5       8.5
Strawberry      14.5      13.0
Vanilla         21.0      13.0
...