猿问

如何使用 pandas 更改 csv 表?

我拥有的?


我有一个 csv 文件,如下所示:


------------------------------------------

|      |         | 2017 | 2018 | 2019

|   x  | England |  70  |  80  |  90

|      |  param1 |  20  |  30  |  40

|      |  param2 |  25  |  35  |  45

|      |  param3 |  25  |  15  |   5

|   y  | England |  60  |  50  |  60

|      |  param1 |  10  |  25  |  10

|      |  param2 |  20  |  25  |  20

|      |  param3 |  30  |  0   |  30

|   x  |   US    |  10  |  20  |  30

|      |  param1 |  3   |  5   |  10

|      |  param2 |  3   |  10  |  10

|      |  param3 |  4   |  5   |  10

|   y  |   US    |  60  |  50  |  60

|      |  param1 |  10  |  25  |  10

|      |  param2 |  20  |  25  |  20

|      |  param3 |  30  |  0   |  30

...

...

...

------------------------------------------

我想要得到什么?


我想得到一个像这样的数据框:对于 param(i) 的每个值我想要一行


------------------------------------------

country | type | param | year | value 

England |  x   | param1| 2017 |  20

England |  x   | param1| 2018 |  30

England |  x   | param1| 2019 |  40

England |  x   | param2| 2017 |  25

England |  x   | param2| 2018 |  35

England |  x   | param2| 2019 |  45

England |  x   | param3| 2017 |  25 

England |  x   | param3| 2018 |  15

England |  x   | param3| 2019 |  5

England |  y   | param1| 2017 |  10

England |  y   | param1| 2018 |  25

England |  y   | param1| 2019 |  10

England |  y   | param2| 2017 |  20

England |  y   | param2| 2018 |  25

England |  y   | param2| 2019 |  20

England |  y   | param3| 2017 |  30

England |  y   | param3| 2018 |   0 

England |  y   | param3| 2019 |  30

...

...

...

------------------------------------------

请注意,我不需要县行的值

我想做什么?

  1. 首先填写x/y类型

  2. 删除包含国家/地区的行并添加名为“county”的列以及国家/地区名称

  3. 使用pivot更改表以获得正确的df

我有什么问题?

  1. 如何用 pandas 轻松填充类型?

  2. 如何将正确的县添加到正确的行?

  3. 我可以使用 pandas hub 来获得我想要的东西还是有更好的方法?

谢谢


四季花海
浏览 95回答 1
1回答

沧海一幻觉

reset_index那么我们来尝试一下melt:param_list = ['param1','param2','param3']s=(df.rename_axis(['country','type'])       .reset_index()    )mask=s['type'].isin(param_list)s['country'] = s['type'].mask(mask).ffill()out = s[mask].melt(['country','type'], var_name='year')输出:    country    type  year  value0   England  param1  2017     201   England  param2  2017     252   England  param3  2017     253   England  param1  2017     104   England  param2  2017     205   England  param3  2017     306        US  param1  2017      37        US  param2  2017      38        US  param3  2017      49        US  param1  2017     1010       US  param2  2017     2011       US  param3  2017     3012  England  param1  2018     3013  England  param2  2018     3514  England  param3  2018     1515  England  param1  2018     2516  England  param2  2018     2517  England  param3  2018      018       US  param1  2018      519       US  param2  2018     1020       US  param3  2018      521       US  param1  2018     2522       US  param2  2018     2523       US  param3  2018      024  England  param1  2019     4025  England  param2  2019     4526  England  param3  2019      527  England  param1  2019     1028  England  param2  2019     2029  England  param3  2019     3030       US  param1  2019     1031       US  param2  2019     1032       US  param3  2019     1033       US  param1  2019     1034       US  param2  2019     2035       US  param3  2019     30
随时随地看视频慕课网APP

相关分类

Python
我要回答