Pandas df 长到宽并旋转?

Jos*_*kel -1 python dataframe pandas

我有一个像这样的熊猫 df:

在此处输入图片说明

这是输入数据:

[{'Region/Province': 'PHILIPPINES', 'Commodity': 'Atis [Sugarapple]', '2018 January': '..', '2018 February': '..'}, {'Region/Province': 'PHILIPPINES', 'Commodity': 'Avocado', '2018 January': '..', '2018 February': '..'}, {'Region/Province': 'PHILIPPINES', 'Commodity': 'Banana Bungulan, green', '2018 January': '12.57', '2018 February': '12.48'}, {'Region/Province': 'PHILIPPINES', 'Commodity': 'Banana Cavendish', '2018 January': '9.96', '2018 February': '8.8'}]
Run Code Online (Sandbox Code Playgroud)

后面的栏目commodity是这样的:2018年1月,2018年2月.. 2018年一直到2021年。

但我需要这样:

在此处输入图片说明

哪里有重复的Commodity名字,但按年/月分割,Amount因为它有自己的列。我试过了pd.wide_to_long(),它接近我需要的东西,但岁月变成了它们自己的专栏。

任何帮助深表感谢

Chr*_*ris 5

Try stack with str.split

stacked = (
    df.set_index(['Region/Province', 'Commodity'])
        .stack()
        .reset_index(name='Amount')
)
stacked[['Year', 'Month']] = stacked['level_2'].str.split(expand=True)
stacked = stacked.drop('level_2', axis=1)
Run Code Online (Sandbox Code Playgroud)

stacked:

  Region/Province               Commodity Amount  Year     Month
0     PHILIPPINES       Atis [Sugarapple]     ..  2018   January
1     PHILIPPINES       Atis [Sugarapple]     ..  2018  February
2     PHILIPPINES                 Avocado     ..  2018   January
3     PHILIPPINES                 Avocado     ..  2018  February
4     PHILIPPINES  Banana Bungulan, green  12.57  2018   January
5     PHILIPPINES  Banana Bungulan, green  12.48  2018  February
6     PHILIPPINES        Banana Cavendish   9.96  2018   January
7     PHILIPPINES        Banana Cavendish    8.8  2018  February
Run Code Online (Sandbox Code Playgroud)

or melt and str.split

melt = df.melt(['Region/Province', 'Commodity'], value_name='Amount')
melt[['Year', 'Month']] = melt['variable'].str.split(expand=True)
melt = melt.drop('variable', axis=1)
Run Code Online (Sandbox Code Playgroud)

melt:

  Region/Province               Commodity Amount  Year     Month
0     PHILIPPINES       Atis [Sugarapple]     ..  2018   January
1     PHILIPPINES                 Avocado     ..  2018   January
2     PHILIPPINES  Banana Bungulan, green  12.57  2018   January
3     PHILIPPINES        Banana Cavendish   9.96  2018   January
4     PHILIPPINES       Atis [Sugarapple]     ..  2018  February
5     PHILIPPINES                 Avocado     ..  2018  February
6     PHILIPPINES  Banana Bungulan, green  12.48  2018  February
7     PHILIPPINES        Banana Cavendish    8.8  2018  February
Run Code Online (Sandbox Code Playgroud)