Панды, многократный расчет на строку кадра данных - PullRequest
0 голосов
/ 29 мая 2018

У меня есть следующий фрейм данных:

df = pd.DataFrame({'date': ['31/12/2015','31/12/2016','31/12/2017','31/12/2018',
                            '31/12/2019','31/12/2020','31/12/2015','31/12/2016',
                            '31/12/2017','31/12/2018','31/12/2019','31/12/2020'], 
                   'season': ['S1','S1','S1','S1','S1','S1','S2','S2','S2','S2','S2','S2'], 
                   'total' : [1,0,0,0,0.022313421,0.053791041,0,0,0.307783314,0,0,0] })
df.date=  pd.to_datetime(df.date)
print(df)  

         date season         total
0  2015-12-31     S1      1.000000
1  2016-12-31     S1      0.000000
2  2017-12-31     S1      0.000000
3  2018-12-31     S1      0.000000
4  2019-12-31     S1      0.022313
5  2020-12-31     S1      0.053791
6  2015-12-31     S2      0.000000
7  2016-12-31     S2      0.000000
8  2017-12-31     S2      0.307783
9  2018-12-31     S2      0.000000
10 2019-12-31     S2      0.000000
11 2020-12-31     S2      0.000000

Я хотел бы сделать несколько вычислений для каждой строки на основе значения, содержащегося в столбце «total», чтобы получить фрейм данных в следующем формате (пример дляпервый ряд):

         date season         total   calculation id       result
0  2015-12-31     S1      1.000000                1           x1
0  2015-12-31     S1      1.000000                2           x2
0  2015-12-31     S1      1.000000                3           x3  
0  2015-12-31     S1      1.000000                4           x4
0  2015-12-31     S1      1.000000                5           x5   

в основном что-то вроде:

for index, row in df.iterrows():
    for i, a in enumerate(np.linspace(0,getattr(row,'total'),6)):
          assing the result of the calculation to the column result

Есть идеи, как мне это сделать?Для примера столбец результата может быть оценен как a*5 в цикле.

Спасибо за вашу помощь,

Pierre

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вы можете попробовать:

import pandas as pd

df = pd.DataFrame({'date' : ['31/12/2015','31/12/2016','31/12/2017','31/12/2018','31/12/2019','31/12/2020', '31/12/2015','31/12/2016','31/12/2017','31/12/2018','31/12/2019','31/12/2020'], 'season':['S1','S1','S1','S1','S1','S1','S2','S2','S2','S2','S2','S2'], 'total' : [1,0,0,0,0.022313421,0.053791041,0,0,0.307783314,0,0,0]  })

df.date=  pd.to_datetime(df.date)

df['key'] = 1 #add key for merge

ids = pd.DataFrame({'calculation_id': [1, 2, 3, 4, 5], 'key': 1})

df = pd.merge(df, ids, on = 'key').drop('key', 1) #cartesian product

df['result'] = df['total']*df['calculation_id']

print(df)

Идея состоит в том, чтобы создать еще один фрейм данных, содержащий ваши идентификаторы расчетов.Затем выполните перекрестное объединение информационного кадра с вашим оригиналом.Наконец, умножьте сумму на id вычисления, чтобы найти результат.

0 голосов
/ 29 мая 2018

Один из способов выполнить задание и «продублировать» строку - это сначала создать столбец list_results для каждой строки в df:

df['list_result'] = df['total'].apply(lambda a: np.linspace(0,a,6)*5)

Из этого столбца вы можете использовать stack для созданияserie со строкой для каждого значения в списках, и, задав индекс сначала, вы можете работать непосредственно с серией:

df_output = (df.set_index(['date', 'season','total'])['list_result'] 
               # set index and work on the column list_result
                 .apply(pd.Series).stack() #will expand the lists of results as rows
                 .reset_index()) # to get back the column 'date', 'season','total'
#you can rename the column
df_output.columns = ['date', 'season','total', 'calculation_id', 'result']

. И первая строка df_output:

         date season     total  calculation_id    result
0  2015-12-31     S1  1.000000               0  0.000000
1  2015-12-31     S1  1.000000               1  1.000000
2  2015-12-31     S1  1.000000               2  2.000000
3  2015-12-31     S1  1.000000               3  3.000000
4  2015-12-31     S1  1.000000               4  4.000000
5  2015-12-31     S1  1.000000               5  5.000000

Обратите внимание, что это не совсем ожидаемый результат, но с помощью np.linspace(0,getattr(row,'total'),6) это то, что вы получите, тогда вы можете изменить эту функцию при создании list_result.

...