【问题标题】:Creating a new dataframe from an existing dataframe从现有数据框创建新数据框
【发布时间】:2021-09-08 07:47:00
【问题描述】:

我有一个大数据框,结构如下:

"date" "key0" "key1" "key2" "key3" "key4" ...
 2010   val0   val1   val2   val3   val4  ...
 2011   val5   val6   val7   val8   val9  ...
 ....   ....   ....   ....   ....   ....

我想要实现的是获取每个日期键值组并创建一个新的数据框:

"date"  "key"  "val"
 2010    key0   val0
 2010    key1   val1
 2010    key2   val2
 2010    key3   val3
 2010    key4   val4
 2011    key0   val5
 2011    key1   val6
 2011    key2   val7
 2011    key3   val8
 2011    key4   val9
 ....    ....   ....

除了手动使用 for 循环之外,还有其他方法可以获得这种数据帧吗?

【问题讨论】:

  • 你试过meltstack吗?两者都应该有效,但它们会以稍微不同的格式为您提供结果。
  • df.melt(id_vars='date') 创建了一个与问题中的行顺序不同的数据框,但这完全没问题。谢谢!
  • 如果需要,您可以在融化后按日期对其进行排序。还可以使用其他参数来设置问题中的列名。详情见我的回答。

标签: python pandas dataframe python-2.7


【解决方案1】:

你可以使用.melt()如下:

(df.melt('date', var_name='key', value_name='val')
   .sort_values('date')
).reset_index(drop=True)

结果:

   date   key   val
0  2010  key0  val0
1  2010  key1  val1
2  2010  key2  val2
3  2010  key3  val3
4  2010  key4  val4
5  2011  key0  val5
6  2011  key1  val6
7  2011  key2  val7
8  2011  key3  val8
9  2011  key4  val9

【讨论】:

    【解决方案2】:

    主要是按照@NickODell 的建议使用stack 来完成转换:

    >>> df.set_index('date') \
          .rename_axis(columns='key') \
          .stack() \
          .rename('val') \
          .reset_index()
    
       date   key   val
    0  2010  key0  val0
    1  2010  key1  val1
    2  2010  key2  val2
    3  2010  key3  val3
    4  2010  key4  val4
    5  2011  key0  val5
    6  2011  key1  val6
    7  2011  key2  val7
    8  2011  key3  val8
    9  2011  key4  val9
    

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 1970-01-01
      • 2022-01-18
      • 2023-01-30
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      相关资源
      最近更新 更多