pandas - 根据列值复制每行'n'次

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas - 根据列值复制每行'n'次相关的知识,希望对你有一定的参考价值。

我想根据列的值复制或复制DataFrame的行,在本例中为orig_qty。所以,如果我有一个DataFrame并使用pandas==0.24.2

import pandas as pd

d = 'a': ['2019-04-08', 4, 115.00], 'b': ['2019-04-09', 2, 103.00]

df = pd.DataFrame.from_dict(
        d, 
        orient='index', 
        columns=['date', 'orig_qty', 'price']
    )

Input

>>> print(df)
         date  orig_qty   price
a  2019-04-08         4   115.0
b  2019-04-09         2   103.0

所以在上面的例子中,orig_qty=4的行应该重复4次,而orig_qty=2的行应该重复2次。在转换之后,我想要一个看起来像这样的DataFrame:

Desired Output

>>> print(new_df)
         date  orig_qty  price  fifo_qty
1  2019-04-08         4  115.0         1
2  2019-04-08         4  115.0         1
3  2019-04-08         4  115.0         1
4  2019-04-08         4  115.0         1
5  2019-04-09         2  103.0         1
6  2019-04-09         2  103.0         1

注意转换后我并不关心索引。我可以详细说明这个用例,但基本上我正在做一些FIFO会计,其中orig_qty值之间可能发生重大变化。

答案

使用Index.repeatDataFrame.locDataFrame.assignDataFrame.reset_index

 new_df = df.loc[df.index.repeat(df['orig_qty'])].assign(fifo_qty=1).reset_index(drop=True)

[输出]

         date  orig_qty  price  fifo_qty
0  2019-04-08         4  115.0         1
1  2019-04-08         4  115.0         1
2  2019-04-08         4  115.0         1
3  2019-04-08         4  115.0         1
4  2019-04-09         2  103.0         1
5  2019-04-09         2  103.0         1
另一答案

使用np.repeat

new_df = pd.DataFrame(col: np.repeat(df[col], df.orig_qty) for col in df.columns)

以上是关于pandas - 根据列值复制每行'n'次的主要内容,如果未能解决你的问题,请参考以下文章

pandas取列值转化为列表

遍历 pandas 行并根据其他列中的值设置列值

如果您使用 pandas 数据框知道列值和行值,如何检索数据? [复制]

Pandas:根据搜索行查找列值[重复]

pandas根据两个条件设置列值[重复]

Pandas:如何根据其他列值的条件对列进行求和?