猿问

根据条件重复数据框行

我正在寻找一种基于值条件插入重复行的方法。

输入数据集包含以周为单位的客户价格和价格有效期-'price_start_week''price_end_week'
想法是通过添加带有实际星期数的新列来扩展数据框,并根据有效星期数重复行。

输入:

╔═══════════════╦══════════════════╦════════════════╦═════════════╗

║ customer_name ║ price_start_week ║ price_end_week ║ price_value ║

╠═══════════════╬══════════════════╬════════════════╬═════════════╣

║ A             ║                4 ║              7 ║         500 ║

║ B             ║                3 ║              6 ║         600 ║

║ C             ║                2 ║              4 ║         700 ║

╚═══════════════╩══════════════════╩════════════════╩═════════════╝

输出:


+---------------+------------------+----------------+-------------+-------------+

| customer_name | price_start_week | price_end_week | actual week | price_value |

+---------------+------------------+----------------+-------------+-------------+

| A             |                4 |              7 |           4 |         500 |

| A             |                4 |              7 |           5 |         500 |

| A             |                4 |              7 |           6 |         500 |

| A             |                4 |              7 |           7 |         500 |

| B             |                3 |              6 |           3 |         600 |

| B             |                3 |              6 |           4 |         600 |

| B             |                3 |              6 |           5 |         600 |

| B             |                3 |              6 |           6 |         600 |

| C             |                2 |              2 |           4 |         700 |

| C             |                2 |              3 |           4 |         700 |

| C             |                2 |              4 |           4 |         700 |

+---------------+------------------+----------------+-------------+-------------+

最好的方法是什么?


我在考虑应用功能,像这样:


def repeat(a):

    if (a['price_start_week']>a['price_end_week']):

        return a['price_start_week']-a['price_end_week']

    ...

df['actual_week']=df.apply(repeat, axis=0)


慕田峪9158850
浏览 141回答 1
1回答

梦里花落0921

Index.repeat按周GroupBy.cumcount数之差使用,然后按每组计数:a = df['price_end_week'] - df['price_start_week'] + 1df = df.loc[df.index.repeat(a)].reset_index(drop=True)df['actual week'] = df.groupby('customer_name').cumcount() + df['price_start_week']print (df)   customer_name  price_start_week  price_end_week  price_value  actual week0              A                 4               7          500            41              A                 4               7          500            52              A                 4               7          500            63              A                 4               7          500            74              B                 3               6          600            35              B                 3               6          600            46              B                 3               6          600            57              B                 3               6          600            68              C                 2               4          700            29              C                 2               4          700            310             C                 2               4          700            4
随时随地看视频慕课网APP

相关分类

Python
我要回答