【发布时间】:2021-05-15 19:45:48
【问题描述】:
尝试使用满足特定条件的值创建新列。下面我列出的代码在某种程度上解释了逻辑,但没有产生正确的输出:
import pandas as pd
import numpy as np
df = pd.DataFrame({'date': ['2019-08-06 09:00:00', '2019-08-06 12:00:00', '2019-08-06 18:00:00', '2019-08-06 21:00:00', '2019-08-07 09:00:00', '2019-08-07 16:00:00', '2019-08-08 17:00:00' ,'2019-08-09 16:00:00'],
'type': [0, 1, np.nan, 1, np.nan, np.nan, 0 ,0],
'colour': ['blue', 'red', np.nan, 'blue', np.nan, np.nan, 'blue', 'red'],
'maxPixel': [255, 7346, 32, 5184, 600, 322, 72, 6000],
'minPixel': [86, 96, 14, 3540, 528, 300, 12, 4009],
'colourDate': ['2019-08-06 12:00:00', '2019-08-08 16:00:00', '2019-08-06 23:00:00', '2019-08-06 22:00:00', '2019-08-08 09:00:00', '2019-08-09 16:00:00', '2019-08-08 23:00:00' ,'2019-08-11 16:00:00'] })
max_conditions = [(df['type'] == 1) & (df['colour'] == 'blue'),
(df['type'] == 1) & (df['colour'] == 'red')]
max_choices = [np.where(df['date'] <= df['colourDate'], max(df['maxPixel']), np.nan),
np.where(df['date'] <= df['colourDate'], min(df['minPixel']), np.nan)]
df['pixelLimit'] = np.select(max_conditions, max_choices, default=np.nan)
输出不正确:
date type colour maxPixel minPixel colourDate pixelLimit
0 2019-08-06 09:00:00 0.0 blue 255 86 2019-08-06 12:00:00 NaN
1 2019-08-06 12:00:00 1.0 red 7346 96 2019-08-08 16:00:00 12.0
2 2019-08-06 18:00:00 NaN NaN 32 14 2019-08-06 23:00:00 NaN
3 2019-08-06 21:00:00 1.0 blue 5184 3540 2019-08-06 22:00:00 6000.0
4 2019-08-07 09:00:00 NaN NaN 600 528 2019-08-08 09:00:00 NaN
5 2019-08-07 16:00:00 NaN NaN 322 300 2019-08-09 16:00:00 NaN
6 2019-08-08 17:00:00 0.0 blue 72 12 2019-08-08 23:00:00 NaN
7 2019-08-09 16:00:00 0.0 red 6000 4009 2019-08-11 16:00:00 NaN
解释为什么输出不正确:
索引行 1 中 df['pixelLimit'] 列的值 12.0 不正确 因为该值来自 df['minPixel'] 索引行 6,该行的 df['date'] 日期时间为 2019-08-08 17:00:00,即大于索引第 1 行中包含的 2019-08-08 16:00:00 df['date'] 日期时间。
索引第 3 行中 df['pixelLimit'] 列的值 6000.0 不正确 因为该值来自 df['maxPixel'] 索引第 7 行,其中 df['date'] 日期时间为 2019-08-09 16:00:00 更大比索引行中包含的2019-08-06 22:00:00df['date']日期时间。
正确的输出:
date type colour maxPixel minPixel colourDate pixelLimit
0 2019-08-06 09:00:00 0.0 blue 255 86 2019-08-06 12:00:00 NaN
1 2019-08-06 12:00:00 1.0 red 7346 96 2019-08-08 16:00:00 14.0
2 2019-08-06 18:00:00 NaN NaN 32 14 2019-08-06 23:00:00 NaN
3 2019-08-06 21:00:00 1.0 blue 5184 3540 2019-08-06 22:00:00 5184.0
4 2019-08-07 09:00:00 NaN NaN 600 528 2019-08-08 09:00:00 NaN
5 2019-08-07 16:00:00 NaN NaN 322 300 2019-08-09 16:00:00 NaN
6 2019-08-08 17:00:00 0.0 blue 72 12 2019-08-08 23:00:00 NaN
7 2019-08-09 16:00:00 0.0 red 6000 4009 2019-08-11 16:00:00 NaN
解释为什么输出正确:
14.0 列 df['pixelLimit'] 的索引行 1 中的值 14.0 是正确的,因为我们正在寻找列 df['minPixel'] 中的最小值,它在列 df['date'] 中的日期时间小于df['colourDate'] 列的索引第 1 行中的日期时间,并且大于或等于 df['date'] 列的索引第 1 行中的日期时间
df['pixelLimit'] 列的索引第 3 行中的值 5184.0 是正确的,因为我们正在寻找列 df['maxPixel'] 中的最大值,它在列 df['date'] 中的日期时间小于df['colourDate'] 列的索引第 3 行中的日期时间,并且大于或等于 df['date'] 列的索引第 3 行中的日期时间
注意事项:
也许np.select 不是最适合这项任务,而某种功能可能更好地服务于这项任务?
另外,也许我需要创建某种动态的len 作为每一行的起点?
请求
请任何人帮助我修改我的代码以实现正确的输出
【问题讨论】:
-
抱歉,@sammywemmy 和 Allolz 打错字了
标签: python pandas dataframe indexing