我有一个包含报价数据的数据框,我想将其转换为部分数据。 数量 列说明每个报价有多少部分。如果报价包含三个部分,其中两个已售出,则该行应在新数据框中出现三次,因此 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/