1. ホーム
  2. python

[解決済み] Pandasで列を行に変換する

2022-04-24 09:25:19

質問

私のデータセットには、n個の日付の場所ごとの情報があります。問題は、各日付が実際には異なるカラムヘッダであることです。例えば、CSVは次のようになります。

location    name    Jan-2010    Feb-2010    March-2010
A           "test"  12          20          30
B           "foo"   18          20          25

私が望むのは、次のようなものです。

location    name    Date        Value
A           "test"  Jan-2010    12       
A           "test"  Feb-2010    20
A           "test"  March-2010  30
B           "foo"   Jan-2010    18       
B           "foo"   Feb-2010    20
B           "foo"   March-2010  25

問題は、カラムにいくつの日付があるかわからないことです(ただし、常に名前の後から始まることは知っています)。

どのように解決しますか?

アップデイト

v0.20より。 melt が1次関数であることから、現在では

df.melt(id_vars=["location", "name"], 
        var_name="Date", 
        value_name="Value")

  location    name        Date  Value
0        A  "test"    Jan-2010     12
1        B   "foo"    Jan-2010     18
2        A  "test"    Feb-2010     20
3        B   "foo"    Feb-2010     20
4        A  "test"  March-2010     30
5        B   "foo"  March-2010     25


旧バージョン(ER): <0.20

を使用することができます。 pd.melt でほとんどを済ませ、ソートする。

>>> df
  location  name  Jan-2010  Feb-2010  March-2010
0        A  test        12        20          30
1        B   foo        18        20          25
>>> df2 = pd.melt(df, id_vars=["location", "name"], 
                  var_name="Date", value_name="Value")
>>> df2
  location  name        Date  Value
0        A  test    Jan-2010     12
1        B   foo    Jan-2010     18
2        A  test    Feb-2010     20
3        B   foo    Feb-2010     20
4        A  test  March-2010     30
5        B   foo  March-2010     25
>>> df2 = df2.sort(["location", "name"])
>>> df2
  location  name        Date  Value
0        A  test    Jan-2010     12
2        A  test    Feb-2010     20
4        A  test  March-2010     30
1        B   foo    Jan-2010     18
3        B   foo    Feb-2010     20
5        B   foo  March-2010     25

(を追加することができます。 .reset_index(drop=True) 出力がきれいになるように)

備考 : pd.DataFrame.sort は非推奨となりました の代わりに pd.DataFrame.sort_values .