【问题标题】:Split data between values of a row在行的值之间拆分数据
【发布时间】:2021-07-06 15:11:11
【问题描述】:

我希望对我拥有的一些数据进行分类。该数据集包含媒体活动背后的变更日志。我想要设置、飞行中和飞行后

示例如下:

Date of change | Change type
01/01/2021  Settings Change (4393)
02/01/2021  Settings Change (7490)
05/01/2021  Campaign set live
06/01/2021  Settings Change (6524)
07/01/2021  Settings Change (1321)
08/01/2021  Campaign paused
09/01/2021  Settings Change (8822)
11/01/2021  Settings Change (5891)
12/01/2021  Campaign Set live
13/01/2021  Settings Change (4669)
14/01/2021  Settings Change (2287)
15/01/2021  Campaign ends
16/01/2021  Settings Change (5649)

我想看到类似的东西:

Date of change | Change | Stage of change
01/01/2021  Settings Change (4393) Pre-Flight
02/01/2021  Settings Change (7490) Pre-Flight
05/01/2021  Campaign live          Campaign live
06/01/2021  Settings Change (6524) In-Flight
07/01/2021  Settings Change (1321) In-Flight
08/01/2021  Campaign paused        Campaign paused
09/01/2021  Settings Change (8822) In-Flight (Paused)
11/01/2021  Settings Change (5891) In-Flight (Paused)
12/01/2021  Campaign live          Campaign live
13/01/2021  Settings Change (4669) In-Flight
14/01/2021  Settings Change (2287) In-Flight
15/01/2021  Campaign ends          Campaign ends
16/01/2021  Settings Change (5649) Post-Flight

我尝试过基于某个值进行拆分,但这是在某个值之前或之后,或者基于日期之类的东西,而不是基于更改类型。

非常感谢任何帮助。

【问题讨论】:

  • 设置、飞行中和飞行后的条件是什么?另外,你能发布一个可以复制的熊猫数据框吗?
  • @Epsi95 pd.read_clipboard(sep='\s\s+| \| ') 解决了输入数据框的后一个问题:)

标签: python pandas dataframe numpy split


【解决方案1】:

让我们首先从 Change type 行规范化 Change 列,特别是 Campaign [Ss]et live 行:

>>> df['Change'] = df['Change type'].str.replace('Campaign set live', 'Campaign live', flags=re.IGNORECASE)
>>> df = df.drop(columns=['Change type'])
>>> df
   Date of change                  Change
0      01/01/2021  Settings Change (4393)
1      02/01/2021  Settings Change (7490)
2      05/01/2021           Campaign live
3      06/01/2021  Settings Change (6524)
4      07/01/2021  Settings Change (1321)
5      08/01/2021         Campaign paused
6      09/01/2021  Settings Change (8822)
7      11/01/2021  Settings Change (5891)
8      12/01/2021           Campaign live
9      13/01/2021  Settings Change (4669)
10     14/01/2021  Settings Change (2287)
11     15/01/2021           Campaign ends
12     16/01/2021  Settings Change (5649)

然后我们基本上希望保持定义活动状态的行不变,并根据之前的值填充它们。

我们可以分别使用同一个字典来处理这两件事

  1. 定义填充值(然后我们可以使用fillna 传播),并且
  2. 屏蔽我们不希望此填充值的行以将其重置为原始Change 列:
>>> state_after_change = {
...     'Campaign live': 'In-Flight',
...     'Campaign paused': 'In-Flight (Paused)',
...     'Campaign ends': 'Post-Flight'
... }
>>> df['State of change'] = df['Change'].map(state_after_change).ffill().fillna('Pre-flight')
>>> df['State of change']
0             Pre-flight
1             Pre-flight
2              In-Flight
3              In-Flight
4              In-Flight
5     In-Flight (Paused)
6     In-Flight (Paused)
7     In-Flight (Paused)
8              In-Flight
9              In-Flight
10             In-Flight
11           Post-Flight
12           Post-Flight
Name: State of change, dtype: object
>>> df['State of change'] = df['State of change'].mask(df['Change'].isin(state_after_change), df['Change'])
>>> df
   Date of change                  Change     State of change
0      01/01/2021  Settings Change (4393)          Pre-flight
1      02/01/2021  Settings Change (7490)          Pre-flight
2      05/01/2021           Campaign live       Campaign live
3      06/01/2021  Settings Change (6524)           In-Flight
4      07/01/2021  Settings Change (1321)           In-Flight
5      08/01/2021         Campaign paused     Campaign paused
6      09/01/2021  Settings Change (8822)  In-Flight (Paused)
7      11/01/2021  Settings Change (5891)  In-Flight (Paused)
8      12/01/2021           Campaign live       Campaign live
9      13/01/2021  Settings Change (4669)           In-Flight
10     14/01/2021  Settings Change (2287)           In-Flight
11     15/01/2021           Campaign ends       Campaign ends
12     16/01/2021  Settings Change (5649)         Post-Flight

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多