Операции с несколькими фреймами данных в PANDAS - PullRequest
0 голосов
/ 03 июня 2019

У меня есть несколько таблиц, которые выглядят так:

ID  YY  ZZ
 2  97  826
 2  78  489
 4  47  751
 4  110 322
 6  67  554
 6  88  714

код:

raw = {'ID': [2, 2, 4, 4,  6, 6,],
   'YY': [97,78,47,110,67,88],
   'ZZ':[826,489,751,322,554,714]}
df = pd.DataFrame(raw)

Для каждого из этих dfs мне нужно выполнить несколько операций.

  1. Сначала сгруппируйте по id,
  2. извлеките длину столбца zz и среднее значение столбца zz,
  3. поместите результаты в новый df

Новый DF, который выглядит следующим образом

Cities  length  mean
Paris     0      0
Madrid    0      0
Berlin    0      0
Warsaw    0      0
London    0      0

код:

raw2 = {'Cities': ['Paris', 'Madrid', 'Berlin',  'Warsaw', 'London'],
   'length': 0,
   'mean': 0}
df2 = pd.DataFrame(raw2)

Я вытащил средний и размер отдельных групп

df_grouped = df.groupby('ID').ZZ.size()
df_grouped2 = df.groupby('ID').ZZ.mean()

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

Я пытался использовать словарь:

   dic_cities = {"Paris":df_grouped.loc[2],
             "Madrid":df_grouped.loc[4],
             "Warsaw":df_grouped.loc[6],
             "Berlin":df_grouped.loc[8],
             "London":df_grouped.loc[10]}

К сожалению, я получаю KeyError: 8

У меня есть 19 df, из которых я должен извлечь эти данные, и финальные таблицы должны выглядеть так:

    Cities  length  mean
    Paris   2       657.5
    Madrid  2       536.5
    Berlin  0       0.0
    Warsaw  2       634.0
    London  0       0.0

Кто-нибудьзнаете, как с этим справиться, используя groupby и словарь, или знаете лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Во-первых, вы должны индексировать df2 на 'Cities':

raw2 = {'Cities': ['Paris', 'Madrid', 'Berlin',  'Warsaw', 'London'],
   'length': 0,
   'mean': 0}
df2 = pd.DataFrame(raw2).set_index('Cities')

Затем вы должны перевернуть свой словарь:

dic_cities = {2: "Paris",
             4: "Madrid",
             6: "Warsaw",
             8: "Berlin",
             10: "London"}

Как только этоГотово, обработка проста как groupby:

for i, sub in df.groupby('ID'):
    df2.loc[dic_cities[i]] = sub.ZZ.agg([len, np.mean]).tolist()

, что дает для df2:

        length   mean
Cities               
Paris      2.0  657.5
Madrid     2.0  536.5
Berlin     0.0    0.0
Warsaw     2.0  634.0
London     0.0    0.0
1 голос
/ 03 июня 2019

Смотрите это:

import pandas as pd

# setup raw data
raw = {'ID': [2, 2, 4, 4,  6, 6,], 'YY': [97,78,47,110,67,88], 'ZZ':[826,489,751,322,554,714]}
df = pd.DataFrame(raw)

# get mean values
mean_values = df.groupby('ID').mean()
# drop column
mean_values = mean_values.drop(['YY'], axis=1)
# get occurrence number
occurrence = df.groupby('ID').size()
# save data
result = pd.concat([occurrence, mean_values], axis=1, sort=False)
# rename columns
result.rename(columns={0:'length', 'ZZ':'mean'}, inplace=True)

# city data
raw2 = 'Cities': ['Paris', 'Madrid', 'Berlin',  'Warsaw', 'London'], 'length': 0, 'mean': 0}
df2 = pd.DataFrame(raw2)

# rename indexes
df2 = df2.rename(index={0: 2, 1:4, 2:8, 3:6, 4:10}

# merge data
df2['length'] = result['length']
df2['mean'] = result['mean']

Outout:

    Cities  length   mean
2    Paris     2.0  657.5
4   Madrid     2.0  536.5
8   Berlin     NaN    NaN
6   Warsaw     2.0  634.0
10  London     NaN    NaN
...