当前位置: 首页 > 面试题库 >

用停止符填充熊猫系列中的NA值

澹台成龙
2023-03-14
问题内容

我正在分析一个时间序列,并基于某些条件,我可以挑选出事件 开始结束
的行。此时,我的系列看起来像这样(为简洁起见,我省略了一些重复的值):

设置

import numpy as np
import pandas
from pandas import Timestamp

datadict = {'event': {
  Timestamp('2010-01-01 00:20:00', tz=None): 'event start',
  Timestamp('2010-01-01 00:30:00', tz=None): '--',
  Timestamp('2010-01-01 00:40:00', tz=None): '--',
  Timestamp('2010-01-01 00:50:00', tz=None): '--',
  Timestamp('2010-01-01 01:00:00', tz=None): '--',
  Timestamp('2010-01-01 01:10:00', tz=None): 'event end',
  Timestamp('2010-01-01 01:20:00', tz=None): '--',
  Timestamp('2010-01-01 02:20:00', tz=None): '--',
  Timestamp('2010-01-01 02:30:00', tz=None): 'event start',
  Timestamp('2010-01-01 02:40:00', tz=None): '--',
  Timestamp('2010-01-01 02:50:00', tz=None): '--',
  Timestamp('2010-01-01 03:00:00', tz=None): '--',
  Timestamp('2010-01-01 03:10:00', tz=None): '--',
  Timestamp('2010-01-01 03:20:00', tz=None): '--',
  Timestamp('2010-01-01 03:30:00', tz=None): 'event end',
}}
data = pandas.DataFrame.from_dict(datadict)

                           event
2010-01-01 00:20:00  event start
2010-01-01 00:30:00           --
2010-01-01 00:40:00           --
2010-01-01 00:50:00           --
2010-01-01 01:00:00           --
2010-01-01 01:10:00    event end
2010-01-01 01:20:00           --
2010-01-01 02:20:00           --
2010-01-01 02:30:00  event start
2010-01-01 02:40:00           --
2010-01-01 02:50:00           --
2010-01-01 03:00:00           --
2010-01-01 03:10:00           --
2010-01-01 03:20:00           --
2010-01-01 03:30:00    event end

这是我想要实现的( 理想情况下没有for循环

                           event  event number
2010-01-01 00:20:00  event start  1
2010-01-01 00:30:00           --  1
2010-01-01 00:40:00           --  1
2010-01-01 00:50:00           --  1
2010-01-01 01:00:00           --  1
2010-01-01 01:10:00    event end  1
2010-01-01 01:20:00           --  NA
2010-01-01 02:20:00           --  NA
2010-01-01 02:30:00  event start  2
2010-01-01 02:40:00           --  2
2010-01-01 02:50:00           --  2
2010-01-01 03:00:00           --  2
2010-01-01 03:10:00           --  2
2010-01-01 03:20:00           --  2
2010-01-01 03:30:00    event end  2
2010-01-01 03:40:00           --  NA
2010-01-01 03:50:00           --  NA

这是我尝试过的

通过对数据质量的一些乐观假设,我可以获得如下 事件编号

table = data[data.event != '--'].reset_index()
table['event number'] = 1 + np.floor(table.index / 2)
table = table.set_index('index')

                           event  event number
index                                         
2010-01-01 00:20:00  event start             1
2010-01-01 01:10:00    event end             1
2010-01-01 02:30:00  event start             2
2010-01-01 03:30:00    event end             2

然后join,我可以将其恢复到原始数据框,并fillna使用method='ffill'

data2 = data.join(table[['event number']])
data2['filled'] = data2['event number'].fillna(method='ffill')

                           event  event number  filled
2010-01-01 00:20:00  event start             1       1
2010-01-01 00:30:00           --           NaN       1
2010-01-01 00:40:00           --           NaN       1
2010-01-01 00:50:00           --           NaN       1
2010-01-01 01:00:00           --           NaN       1
2010-01-01 01:10:00    event end             1       1
2010-01-01 01:20:00           --           NaN       1 # <- d'oh
2010-01-01 02:20:00           --           NaN       1 # <- d'oh 
2010-01-01 02:30:00  event start             2       2
2010-01-01 02:40:00           --           NaN       2
2010-01-01 02:50:00           --           NaN       2
2010-01-01 03:00:00           --           NaN       2
2010-01-01 03:10:00           --           NaN       2
2010-01-01 03:20:00           --           NaN       2
2010-01-01 03:30:00    event end             2       2

问题

如您所见,事件之间的时间(01:20到02:20)与事件#1相关联。

问题

无论如何,有没有跳过这些部分而不循环?


问题答案:

您可以通过查看的数量event start和的累加总和来实现此目的event end

>>> data['event number'] = (data.event == 'event start').cumsum()
>>> data
                           event  event number
2010-01-01 00:20:00  event start             1
2010-01-01 00:30:00           --             1
2010-01-01 00:40:00           --             1
2010-01-01 00:50:00           --             1
2010-01-01 01:00:00           --             1
2010-01-01 01:10:00    event end             1
2010-01-01 01:20:00           --             1
2010-01-01 02:20:00           --             1
2010-01-01 02:30:00  event start             2
2010-01-01 02:40:00           --             2
2010-01-01 02:50:00           --             2
2010-01-01 03:00:00           --             2
2010-01-01 03:10:00           --             2
2010-01-01 03:20:00           --             2
2010-01-01 03:30:00    event end             2

现在,您只需要设置nan为没有事件即可;但这些位置对应于行的累积累加event start等于的累积累加event end(移动1行)

>>> idx = data['event number'] == (data.event.shift(1) == 'event end').cumsum()
>>> data.loc[idx, 'event number'] = np.nan
>>> data
                           event  event number
2010-01-01 00:20:00  event start             1
2010-01-01 00:30:00           --             1
2010-01-01 00:40:00           --             1
2010-01-01 00:50:00           --             1
2010-01-01 01:00:00           --             1
2010-01-01 01:10:00    event end             1
2010-01-01 01:20:00           --           NaN
2010-01-01 02:20:00           --           NaN
2010-01-01 02:30:00  event start             2
2010-01-01 02:40:00           --             2
2010-01-01 02:50:00           --             2
2010-01-01 03:00:00           --             2
2010-01-01 03:10:00           --             2
2010-01-01 03:20:00           --             2
2010-01-01 03:30:00    event end             2

[15 rows x 2 columns]


 类似资料:
  • 问题内容: 熊猫的read_csv()方法将’NA’解释为nan(不是数字),而不是有效的字符串。 在下面的简单情况下,请注意,第1行第2列(基于零的计数)的输出为’nan’而不是’NA’。 sample.tsv (制表符分隔) PDB链SP_PRIMARY RES_BEG RES_END PDB_BEG PDB_EN​​D SP_BEG SP_END 5d8b N P60490 1146 114

  • 欢迎提供任何关于这个问题更准确标题的帮助。。 我有一个数据框,其中包含客户级别的观察结果,记录日期以及客户在该日期消费的物品。看起来像这样。 此数据集中的每个观察值都与一个独特的存储日组合有关,但每个存储日观察值都是以消耗的物品的正数为条件列出的,即

  • 问题内容: 如果我有一个包含多列的数据框,如何只填充一列?还是一组列? 我只知道如何按轴进行操作。 问题答案: tl; dr: 我还添加了一个自我包含的示例:

  • 我有一个带有几列的。其中一列包含使用货币的符号,例如欧元或美元符号。另一列包含预算值。例如,在一行中,它可能意味着5000欧元的预算,而在下一行中,它可能意味着2000美元的预算。 在熊猫我想添加一个额外的列到我的DataFrame,正常化的欧元预算。所以基本上,对于每一行,如果货币列中的符号是欧元符号,新列中的值应该是预算列中的值*1,新列中的值应该是预算列的值*0.78125如果货币栏中的符号

  • 我有两个不同形状的df。一个包含单词及其频率,另一个包含单词及其引理。 第一个df总是将一个单词映射到一个频率,第二个df将许多单词映射到一个引理(多次)。例如: DF1: 和df2: 我想将引理信息添加到,通过搜索的每个单词,将其与中的单词进行比较,并从中提取引理信息以将其添加回。 对于df1中的值是否始终相同,有一些有用的答案,但由于我想对每一行中包含不同单词的行执行此操作,因此我不确定如何继

  • 我想在两栏中填入缺少的值。根据预定义的类别1的最后日期(在先前填充的行中预定义),存在日期,类别2应填充另一行的值,例如: 数据示例: 因此,应根据< code>Cat1列- 中< code>cat值的最后存在日期,填写< code>Date列的< code>NaN。< code>Cat2列中的< code>NaN应由< code>mouse填写,作为已经为< code > Date -< cod