Python 3.x 在熊猫中创建具有两个独特条件的新列?
试图找出熊猫的复杂之处-我有以下示例数据框:Python 3.x 在熊猫中创建具有两个独特条件的新列?,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,试图找出熊猫的复杂之处-我有以下示例数据框: Date Value Diff 4/2/2019 17:00 864 57 4/2/2019 17:15 864 0 4/2/2019 17:30 864 0 4/2/2019 17:45 864 0 4/2/2019 18:00 864 0 ... 5/2/2019 07:00 864 0 5/2
Date Value Diff
4/2/2019 17:00 864 57
4/2/2019 17:15 864 0
4/2/2019 17:30 864 0
4/2/2019 17:45 864 0
4/2/2019 18:00 864 0
...
5/2/2019 07:00 864 0
5/2/2019 07:15 864 0
5/2/2019 07:30 864 0
5/2/2019 07:45 864 0
5/2/2019 08:00 864 0
5/2/2019 08:15 864 0
5/2/2019 08:30 1564 700
5/2/2019 08:45 1784 223
5/2/2019 09:00 1904 120
5/2/2019 09:15 2095 191
5/2/2019 09:30 2095 183
5/2/2019 09:45 2095 85
5/2/2019 10:00 2095 58
5/2/2019 10:15 2095 134
5/2/2019 10:30 2555 78
5/2/2019 10:45 2678 123
5/2/2019 11:00 2777 99
预期的数据帧如下所示:
Date Value Diff NewCol1
4/2/2019 17:00 864 57 57
4/2/2019 17:15 864 0 63.63
4/2/2019 17:30 864 0 63.63
4/2/2019 17:45 864 0 63.63
4/2/2019 18:00 864 0 63.63
...
5/2/2019 07:00 864 0 63.63
5/2/2019 07:15 864 0 63.63
5/2/2019 07:30 864 0 63.63
5/2/2019 07:45 864 0 63.63
5/2/2019 08:00 864 0 63.63
5/2/2019 08:15 864 0 63.63
5/2/2019 08:30 1564 700 63.63
5/2/2019 08:45 1784 223 223
5/2/2019 09:00 1904 120 120
5/2/2019 09:15 2095 191 191
5/2/2019 09:30 2095 183 183
5/2/2019 09:45 2095 85 85
5/2/2019 10:00 2095 58 58
5/2/2019 10:15 2095 134 134
5/2/2019 10:30 2555 78 78
5/2/2019 10:45 2678 123 123
5/2/2019 11:00 2777 99 99
...
创建NewCol1
有两个条件:
值时,如果Diff
为0,并且仅在时间范围从07:00到18:00之间,则计算0+1的数字和值的差值并将其除以(在本例中,(1564-864)/11
)。请注意,+1
用于计算最后一个0
之后的行,该行位于08:30
,此类事件将始终连续发生,如本例所示(示例4/2/2019 17:15至5/2/2019 08:30
)
Value
,且Diff
大于0,则将该行中的Diff
复制到NewCol1
,包括上次重复Value
后的行,且Diff
大于0(例如2019年5月2日09:45至2019年5月2日10:30
)
if-else
,因为高效是很重要的,因为将有数十万行。添加列:
df['NewCol1'] = df['Diff']
我知道,因为您希望避免其他优化,如果-但目前该解决方案可以工作: 时间间隔- 适用于—
您能否通过以下提供样品来改进您的问题?另外,如果
Value
没有重复代码应该执行的操作,只需复制Diff
?如果Diff
为0怎么办?
def convertValues(row):
if (row['Diff'] > 0):
return row['Diff']
if (row['Diff'] == 0 and row['Date'].between_time('7:00','18:00'):
return row['Value'] - int(row['Value'].name-1) / row.name
transformedDf = df.apply(lambda x: convertValues(x), axis=1)