Как добавить новый столбец на основе даты в сводную таблицу в pandas? - PullRequest
0 голосов
/ 05 апреля 2020

Я работаю с таблицами ECD C covid-19: source = https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide

Я преобразовал таблицу loooooooooong в сводную, более полезную, используя pandas , Теперь у меня есть таблица, индексируемая по дате, со случаями и смертями в некоторых выбранных странах

def downloadECDC(url)
    world = pd.read_csv(url)
    today = datetime.today().strftime("%d%m%Y")
    world.to_csv('ECDC' + today + '.csv')

    world['date'] = pd.to_datetime((world.year*10000+world.month*100+world.day).apply(str),format='%Y%m%d')



    dt = world[['date','deaths','cases','countriesAndTerritories', 'popData2018']]
    dt['DperHab'] = dt['deaths']/dt['popData2018']


    preoutput = pd.pivot_table(dt.loc[(dt['countriesAndTerritories']=='Spain') | (dt['countriesAndTerritories']=='Italy') | (dt['countriesAndTerritories']=='Germany') | (dt['countriesAndTerritories']=='France') |  (dt['countriesAndTerritories']=='United_Kingdom') | (dt['countriesAndTerritories']=='Portugal') | (dt['countriesAndTerritories']=='Netherlands') | (dt['countriesAndTerritories']=='Iran') | (dt['countriesAndTerritories']=='China') | (dt['countriesAndTerritories']=='South_Korea')], index = ['date'], values=['deaths','cases'], columns = 'countriesAndTerritories', aggfunc=np.sum, fill_value = 0)
    precases = pd.pivot_table(dt.loc[(dt['countriesAndTerritories']=='Spain') | (dt['countriesAndTerritories']=='Netherlands')| (dt['countriesAndTerritories']=='Italy') | (dt['countriesAndTerritories']=='France') ], index = ['date'], values=['cases'], columns = 'countriesAndTerritories', aggfunc=np.sum, fill_value = 0)
    predeaths= pd.pivot_table(dt.loc[(dt['countriesAndTerritories']=='Spain') | (dt['countriesAndTerritories']=='Netherlands')| (dt['countriesAndTerritories']=='Italy') | (dt['countriesAndTerritories']=='France')], index = ['date'], values=['deaths'], columns = 'countriesAndTerritories', aggfunc=np.sum, fill_value = 0)
    predxh= pd.pivot_table(dt.loc[(dt['countriesAndTerritories']=='Spain') | (dt['countriesAndTerritories']=='Netherlands')| (dt['countriesAndTerritories']=='Italy') | (dt['countriesAndTerritories']=='France')], index = ['date'], values=['DperHab'], columns = 'countriesAndTerritories', aggfunc=np.sum, fill_value = 0)
    output = preoutput.reindex(axis = 1, level = 1, labels = ['Spain','Italy','Germany','France','United_Kingdom','Portugal','Netherlands','Iran','China','South_Korea'])
    cases = precases.reindex(axis = 1, level = 1, labels = ['Spain','Italy','France','Netherlands'])
    deaths = predeaths.reindex(axis = 1, level = 1, labels = ['Spain','Italy','France','Netherlands'])
    dxhab = predxh.reindex(axis = 1, level = 1, labels = ['Spain','Italy','France','Netherlands'])

    output.to_excel('ECDC' + today + '.xlsx')

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

preaggdeath= pd.pivot_table(dt.loc[(dt['countriesAndTerritories']=='Spain') | (dt['countriesAndTerritories']=='Netherlands')| (dt['countriesAndTerritories']=='Italy') | (dt['countriesAndTerritories']=='France')], index = ['date'], values=[XXXXX], columns = 'countriesAndTerritories', aggfunc=np.sum, fill_value = 0) # when XXXX is like to add deaths from one date to the start of series backwards

Заранее спасибо

Редактировать: Что у меня есть

my table

Что бы я хотел иметь

new table

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

@ Тригоном поставил меня в правильном направлении. Это еще проще благодаря pandas 'составным выражениям.

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

deathsCumulative = deaths.cumsum()

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

0 голосов
/ 06 апреля 2020

как это?

df["aggregated deaths"] = df["daily deaths"].cumsum()

...