python Pandas : Transforming dataframe according to a specific column

标签 python pandas

我有一个包含报价数据的数据框,我想将其转换为部分数据。 数量 列说明每个报价有多少部分。如果报价包含三个部分,其中两个已售出,则该行应在新数据框中出现三次,因此 sold 列在两行上的值为 1,在一行上的值为 0。

实际数据框包含更多列,这些列应在转换后的数据框中保持完整。 Date 列作为示例。

我的输入:

    Offer name     Quantity   Sold   Date
  0 A              3          2      2022-05 
  1 B              2          1      2022-01 
  2 C              1          1      2022-04 
  3 D              1          1      2022-04 
  4 E              1          1      2022-05

期望的输出:

    Offer name     Quantity   Sold   Date
  0 A              1          1      2022-05 
  1 A              1          1      2022-05 
  2 A              1          0      2022-05 
  3 B              1          1      2022-01 
  4 B              1          0      2022-01
  and so on...

谢谢!!

最佳答案

解决方案

s = df.reindex(df.index.repeat(df['Quantity']))
s['Quantity'] = 1
s['Sold'] = s.groupby(level=0).cumcount().lt(s['Sold']).astype(int)

解释

精确重复数据帧的索引数量

>>> s = df.reindex(df.index.repeat(df['Quantity']))
>>> s

  Offer name  Quantity  Sold     Date
0          A         3     2  2022-05
0          A         3     2  2022-05
0          A         3     2  2022-05
1          B         2     1  2022-01
1          B         2     1  2022-01
2          C         1     1  2022-04
3          D         1     1  2022-04
4          E         1     1  2022-05

将上述数据帧分组到索引上并使用cumcount创建一个顺序计数器,

>>> s.groupby(level=0).cumcount()
0    0
0    1
0    2
1    0
1    1
2    0
3    0
4    0
dtype: int64

标记顺序计数器小于 Sold 数量的行,然后将 dtype 更改为 int 并将结果分配给 Sold

>>> s['Sold'] = s.groupby(level=0).cumcount().lt(s['Sold']).astype(int)
>>> s

  Offer name  Quantity  Sold     Date
0          A         1     1  2022-05
0          A         1     1  2022-05
0          A         1     0  2022-05
1          B         1     1  2022-01
1          B         1     0  2022-01
2          C         1     1  2022-04
3          D         1     1  2022-04
4          E         1     1  2022-05

关于 python Pandas : Transforming dataframe according to a specific column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72437902/

相关文章:

python - 将 HDFS(Hadoop 文件系统)目录中的文件读入 Pandas 数据帧

python - 使用 NaN 按列对数据进行 Winsorizing

python - 如何对 groupby 对象中没有时间列的基于时间的列进行排序

python - Django UNIQUE 约束失败

python - Tkinter 更改未聚焦文本小部件上的选择背景颜色

python - __getattr__中调用__getattribute__会无限大吗?

python - 如何在pandas中将数组列读取为数组而不是字符串

python - Pandas 阅读 csv 方向

python - matplotlib 子图箱线图隐藏一些轴标签

python - 关于 tkinter 中绑定(bind)标签的基本查询