使用 Pandas 将列转换为行

新手上路,请多包涵

所以我的数据集有一些 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

我的问题是我不知道列中有多少日期(尽管我知道它们总是从名字开始)

原文由 Wizuriel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 337
2 个回答

更新

从 v0.20 开始, melt 是一阶函数,您现在可以使用

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

原文由 DSM 发布,翻译遵循 CC BY-SA 4.0 许可协议

Use set_index with stack for MultiIndex Series , then for DataFrame add reset_index with rename :

 df1 = (df.set_index(["location", "name"])
         .stack()
         .reset_index(name='Value')
         .rename(columns={'level_2':'Date'}))
print (df1)
  location  name        Date  Value
0        A  test    Jan-2010     12
1        A  test    Feb-2010     20
2        A  test  March-2010     30
3        B   foo    Jan-2010     18
4        B   foo    Feb-2010     20
5        B   foo  March-2010     25

原文由 jezrael 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题