为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻过高山走不出你 2023-07-11 14:13:27
编辑: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 解决方案),但我相信有一个更快、可读、更简单的解决方案。
查看完整描述

1 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

您正在寻找df.pivot


df = 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-10

Label          3          3       2          1  ...       2          2          1          4

Name                                            ...

foo1      1058.0        NaN     NaN        NaN  ...     NaN        NaN        NaN        NaN

foo2         NaN     1685.0  1615.0        NaN  ...     NaN        NaN        NaN        NaN

foo3         NaN        NaN     NaN     1195.0  ...  1295.0        NaN        NaN     1665.0

foo4         NaN        NaN     NaN        NaN  ...     NaN     2285.0     1285.0        NaN


[4 rows x 10 columns]


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信