Эффективное преобразование данных в pandas - PullRequest
2 голосов
/ 06 мая 2020

Как лучше всего решить эту проблему, используя pandas и python?

В настоящее время у меня есть кадр данных pandas в относительно неудобном формате, например:

        Country      Indicator  2000  2010
0   Afghanistan            foo     1   2.5
1   Afghanistan            bar     3   4.5
2   Afghanistan            zoo     5   6.5
3       Bolivia            foo     7   8.5
4       Bolivia            bar     9  10.5
5       Bolivia            zoo    11  12.5
6      Cameroon            foo     2   1.5
7      Cameroon            bar     4   3.5
8      Cameroon            zoo     6   5.5
9       Denmark            foo     8   7.5
10      Denmark            bar    10   9.5
11      Denmark            zoo    12  11.5

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

Для 2000:

   foo bar zoo
0   1   3   5
1   7   9   11
2   2   4   6
3   8   10  12

Для 2010:

    foo  bar   zoo
0   2.5  4.5   6.5
1   8.5  10.5  12.5
2   1.5  3.5   5.5
3   7.5  9.5   11.5

Какой может быть наиболее эффективный способ выполнить это в pandas?

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

1 Ответ

3 голосов
/ 06 мая 2020

Это преобразование называется «поворотным», а иногда и «литьем» или «расплавлением». Это настолько распространено, что покрывается определенными c функциями в API. :

df_years = df.pivot(index='Country', columns='Indicator', values=['2000', '2010'])    

            2000             2010           
Indicator    bar  foo   zoo   bar  foo   zoo
Country                                     
Afghanistan  3.0  1.0   5.0   4.5  2.5   6.5
Bolivia      9.0  7.0  11.0  10.5  8.5  12.5
...

Это приводит к многоуровневым столбцам :

df_years['2000']                                                                                                                                                                                    

Indicator    bar  foo   zoo
Country                    
Afghanistan  3.0  1.0   5.0
Bolivia      9.0  7.0  11.0
...
df_years['2010']                                                                                                                                                                                   

Indicator     bar  foo   zoo
Country                     
Afghanistan   4.5  2.5   6.5
Bolivia      10.5  8.5  12.5
...

Вы должны просто работать с ними, но если вам нужны плоские фреймы данных, вы можете назначить их следующим образом:

df_2000 = df_years['2000']

Indicator    bar  foo   zoo
Country                    
Afghanistan  3.0  1.0   5.0
Bolivia      9.0  7.0  11.0
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...