Цикл Python словарь со значениями списка

#python #loops #dictionary #group-by

#python #циклы #словарь #группировка по

Вопрос:

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

     data = {'state': ['Rome', 'Venice', 'NY', 'Boston', 'London', 'Bristol'],
    'year': [2000, 2001, 2002, 2001, 2003, 2003],
    'number': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}

df = pd.DataFrame(data)
  

и создал словарь, как показано ниже:

 dic = {
    'it':['Rome', 'Venice'], 
    'UK':['London', 'Bristol'],
    'US':['NY', 'Boston']
}
  

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

Я пробовал что-то подобное, но это не работает….

 for x, y in dic.items():
    x = df[df['state'].isin(y)].groupby(['year'], as_index=False)['numer'].mean()
  

Например, ожидаемый результат для UK for будет следующим:

 UK

    year    number
0   2003    3.05
  

Комментарии:

1. можете ли вы опубликовать ожидаемый результат

2. @deadshot ожидаемый результат опубликован

Ответ №1:

Ваш код почти правильный, просто опечатка в numer и сохраните результаты в словаре:

 import pandas as pd

data = {'state': ['Rome', 'Venice', 'NY', 'Boston', 'London', 'Bristol'],
    'year': [2000, 2001, 2002, 2001, 2003, 2003],
    'number': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}

dic = {
    'it':['Rome', 'Venice'],
    'UK':['London', 'Bristol'],
    'US':['NY', 'Boston']
}

df = pd.DataFrame(data)

out = {}
for x, y in dic.items():
    out[x] = df[df['state'].isin(y)].groupby(['year'], as_index=False)['number'].mean()

for country, df in out.items():
    print(country)
    print(df)
    print('-' * 80)
  

С принтами:

 it
   year  number
0  2000     1.5
1  2001     1.7
--------------------------------------------------------------------------------
UK
   year  number
0  2003    3.05
--------------------------------------------------------------------------------
US
   year  number
0  2001     2.4
1  2002     3.6
--------------------------------------------------------------------------------
  

Ответ №2:

Более простым способом является создание сопоставления с континентом в качестве значения в паре ключ / значение. Затем замените отображение столбца состояния на столбец континента. Последний раз используйте функцию groupby для continient и year и выведите среднее значение столбца number

 data = {'state': ['Rome', 'Venice', 'NY', 'Boston', 'London', 'Bristol'],
'year': [2000, 2001, 2002, 2001, 2003, 2003],
'number': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}

mapping = {
'Rome':'it', 
'Venice':'it',
'London':'UK',
'Bristol':'UK',
'NY':'US',
'Boston':'US'
}

df = pd.DataFrame(data)
df['continent']=df['state'].replace(mapping)
print(df.head())
print(df.groupby(['continent','year'])['number'].mean())