我有一个带有时间戳日期时间索引的pandas DataFrame和与每个日期对应的值。例如,df = pd.DataFrame(['0.11', '0.07', '0.04', '-0.11', '-0.04', '0.08', '0.1'], index=['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06', '2017-01-07'], columns=['values'])
。
我想根据上述数据框的当前值和历史值创建一个额外的列(我们称之为'new_value'
)。
逻辑应该是:
我尝试了多种解决方案,但似乎无法解决这个问题。如,
new_frame = pd.DataFrame(np.zeros(len(df.index),index=df.index,columns=['new_value'])
for date in df.index:
if df['value'][date.strftime('%Y-%m-%d')] > 0.1:
new_frame.set_value(date.strftime("%Y-%m-%d"),'new_value',-1)
但我收到错误:'ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().'
如果我然后将第三行更改为:
if df['value'][date.strftime('%Y-%m-%d').item() > 0.1:
我收到错误:'ValueError: can only convert an array of size 1 to a Python scalar'
答案 0 :(得分:2)
numpy.searchsorted
s = df['values'].astype(float)
al = np.array([-.1, -.05])
bl = np.array([1, np.nan, 0])
ar = np.array([.05, .1])
br = np.array([0, np.nan, -1])
l = bl[al.searchsorted(s.values)]
r = br[ar.searchsorted(s.values, side='right')]
df.assign(new_values=pd.Series(l + r, s.index).ffill())
values new_values
2017-01-01 0.11 -1.0
2017-01-02 0.07 -1.0
2017-01-03 0.04 0.0
2017-01-04 -0.11 1.0
2017-01-05 -0.04 0.0
2017-01-06 0.08 0.0
2017-01-07 0.1 -1.0
如何运作
s
al
bl
ar
br
searchsorted
会在searchsorted
中的索引来标识映射值side='right'
nan
+值将为nan
ffill
向前宣传价值。 <强> 设置 强>
假设由OP
df
df = pd.DataFrame(
['0.11', '0.07', '0.04', '-0.11',
'-0.04', '0.08', '0.1'],
['2017-01-01', '2017-01-02',
'2017-01-03', '2017-01-04',
'2017-01-05', '2017-01-06',
'2017-01-07'],
['values']
)
values
2017-01-01 0.11
2017-01-02 0.07
2017-01-03 0.04
2017-01-04 -0.11
2017-01-05 -0.04
2017-01-06 0.08
2017-01-07 0.1