基于另一个数据框创建新的 pandas 数据框

编辑:


pandas 1.0.5有一个bug,升级到1.1.1后就没有错误了。


我有一个 pandas 数据框,如下所示:


   Name      Date      Price      Label   Y      Z

   foo1     1/1/20      100       1       _      _

   foo1     1/1/20      200       2       _      _

    .       .           .         .       .      .

    .       .           .         .       .      .

   foo1     1/8/20      240       1       _      _

   foo2     1/2/20      500       1       _      _

    .       .           .         .       .      .

    .       .           .         .       .      .

   foo2     1/7/20      423       4       _      _

    .       .           .         .       .      .

    .       .           .         .       .      .

  • 该列有 80 个唯一值Name,即 foo1 - foo80

  • 有 20 个唯一Date

  • 有 4 个唯一Label

  • Y 和 Z 列与新数据框无关

我想创建一个表 st,它将有 80 行(每行对应每个名称)和 20*4 + 1 列(每个日期标签组合 20x4,名称 1 列)。

最终的数据框应如下所示:

**Name 1/1/20(Label1)  1/1/20(Label2)  1/1/20(Label3)  1/1/20(Label4)  1/2/20(Label1)    ...    4/7/20(Label4)**

 foo1    100             200              300             -1              -1                        -1

 foo2    -1               -1               -1             -1              500                       -1

...............

...............

-1 表示原始条目中没有特定名称-日期-标签组合的条目。

我基本上是 pandas 的新手,我当然可以手动迭代地构建数据框(if..else 解决方案),但我相信有一个更快、可读、更简单的解决方案。


翻过高山走不出你
浏览 99回答 1
1回答

桃花长相依

您正在寻找df.pivotdf = df.pivot(index='Name', columns=['Date', 'Label'], values='Price')警告:如果任何名称-日期-标签组合重复(即出现在多行中),则会引发错误。使用pivot_table或更好groupby+unstack如果Name、Date、 和Label在索引中,则使用unstack而不是pivot使用示例数据更新df = pd.DataFrame({    # 'A': [160, 457, 457, 482, 482, 482, 482, 423, 223, 506],    # 'B': ['8/27/2015 0:00','10/15/2015 0:00','10/15/2015 0:00','10/28/2015 0:00','10/28/2015 0:00','10/28/2015 0:00','10/28/2015 0:00','9/29/2015 0:00','9/9/2015 0:00','11/9/2015 0:00'],    'Date': ['8/28/2015 0:00','10/16/2015 0:00','10/16/2015 0:00','10/29/2015 0:00','10/29/2015 0:00','10/29/2015 0:00','10/29/2015 0:00','9/30/2015 0:00','9/10/2015 0:00','11/10/2015 0:00'],    # 'C': [5, 5, 5, 5, 5, 5, 5, 5, 5, 5],    # 'D': [1271, 1825, 1825, 1455, 1455, 1455, 1455, 2522, 1385, 1765],    'Price': [1058, 1685, 1615, 1195, 1255, 1279, 1295, 2285, 1285, 1665],    'Label': [3, 3, 2, 1, 3, 4, 2, 2, 1, 4],    # 'E': [13, 127, 127, -1, -1, -1, -1, -1, -1, -1],    'Name': ['foo1','foo2','foo2','foo3','foo3','foo3','foo3','foo4','foo4','foo3'],    # 'F': [4, 4, 4, 3, 3, 3, 3, 3, 3, 3],    # 'G': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],    # 'H': ['Friday','Friday','Friday','Thursday','Thursday','Thursday','Thursday','Wednesday','Thursday','Tuesday'],    # 'I': [213, 140, 210, 260, 200, 176, 160, 237, 100, 100],    # 'J': [16.758457907159716,7.671232876712329,11.506849315068493,17.869415807560138,13.745704467353955,12.096219931271474,10.996563573883162,9.397303727200637,7.220216606498194,5.6657223796034]})df.Date = pd.to_datetime(df.Date)df = df.pivot(index='Name', columns=['Date', 'Label'], values='Price')df = df.fillna(-1)print(df)输出Date  2015-08-28 2015-10-16         2015-10-29  ...         2015-09-30 2015-09-10 2015-11-10Label          3          3       2          1  ...       2          2          1          4Name                                            ...foo1      1058.0        NaN     NaN        NaN  ...     NaN        NaN        NaN        NaNfoo2         NaN     1685.0  1615.0        NaN  ...     NaN        NaN        NaN        NaNfoo3         NaN        NaN     NaN     1195.0  ...  1295.0        NaN        NaN     1665.0foo4         NaN        NaN     NaN        NaN  ...     NaN     2285.0     1285.0        NaN[4 rows x 10 columns]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python