【问题标题】:add new rows to dataframe based on condition python pandas根据条件python pandas向数据框添加新行
【发布时间】:2021-06-20 23:53:12
【问题描述】:

需要根据条件向数据框添加新行。

当前数据框:

在这个数据框中有 4 列。我想做的是检查“时间”列并检查每个夜班午夜 12 点的最接近值,并添加两个新行,分别为 11:59:59 和 00:00:01,其值与最近的数据点。

例如:03-01 Night 的最接近值(到 12PM)是 21:46:54。所以需要添加两行,

W25     03-01 Night    RUNNING    23:59:59
W25     03-01 Night    RUNNING    00:00:01

所以最终预期的数据框应该是这样的:

样本数据:

data={'Machine': {0: 'W5', 343: 'W5', 344: 'W5', 586: 'W5', 587: 'W5'}, 'State': {0: 'start', 343: 'STOPPED', 344: 'RUNNING', 586: 'STOPPED', 587: 'MAINT'}, 'Day-Shift': {0: '03-01 Night', 343: '03-01 Night', 344: '03-01 Night', 586: '03-01 Night', 587: '03-01 Night'}, 'Time': {0: Timestamp('2021-03-01 21:00:00'), 343: Timestamp('2021-03-01 22:16:54'), 344: Timestamp('2021-03-01 23:16:54'), 586: Timestamp('2021-03-01 23:48:45'), 587: Timestamp('2021-03-02 02:28:54')}}

非常感谢您的支持!!!!!!

【问题讨论】:

  • 您是否有可以使用的完整日期时间对象,我发现您的列中缺少年份?如果您有正确格式化的日期时间对象,那么夜晚/白天也是多余的。
  • @Manakin 你有什么办法解决这个问题吗?

标签: python pandas dataframe datetime pandas-groupby


【解决方案1】:

您可以使用idxmax() 查找每天的最大记录,然后创建一个日期时间对象。

df1 = df.loc[df.groupby([df['Time'].dt.normalize()])['Time'].idxmax()]
df1 = pd.concat([df1] * 2)

df1['Time'] = pd.to_datetime((df1['Time'].dt.normalize().astype(str) + [' 23:59:59', ' 00:00:01']))

print(df1)

    Machine  State  Day-Shift                Time
587     W25  MAINT  03-01 Day 2021-03-01 23:59:59
587     W25  MAINT  03-01 Day 2021-03-01 00:00:01

df = pd.concat([df,df1]).sort_index().reset_index(drop=True)


  Machine    State  Day-Shift                Time
0     W25    start  03-01 Day 2021-03-01 07:00:00
1     W25  STOPPED  03-01 Day 2021-03-01 07:16:54
2     W25  RUNNING  03-01 Day 2021-03-01 07:16:54
3     W25  STOPPED  03-01 Day 2021-03-01 07:28:45
4     W25    MAINT  03-01 Day 2021-03-01 07:28:54
5     W25    MAINT  03-01 Day 2021-03-01 23:59:59
6     W25    MAINT  03-01 Day 2021-03-01 00:00:01

【讨论】:

  • 非常感谢。但这给了我这个错误。 ValueError: 操作数不能与形状 (4,) (2,) 一起广播
  • 我不明白上面的代码是怎么做到的,你有没有改变任何代码行?
  • 不,我没有改变任何东西。在第 3 行,df['Time'] 包含四列,但在列表中仅包含两个元素。我认为这就是这个错误的原因。
  • df1['Time'] = pd.to_datetime((df1['Time'].dt.normalize().astype(str) + ['23:59:59', '00: 00:01'])) 这一行给出了上述错误
  • @domahc 不是最优雅的,但试试df1 = pd.concat([ y.assign(Time=pd.to_datetime((y['Time'].dt.normalize().astype(str) + [' 23:59:59', ' 00:00:01'])) ) for x,y in df1.groupby(df1['Time'].dt.day) ])
猜你喜欢
  • 2021-03-02
  • 2020-06-09
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
相关资源
最近更新 更多