Python 在数据帧中缺失的值中查找最接近的有效数字
我有一个数据集,其中有多个不同长度的缺失序列,我想找到在这些序列之前和之后出现的一些特定日期的第一个有效数字。在下面的样本数据集中,我想找到最接近2018-11-26日期的B列的有效数字 数据示例: 预期产出: 一些细节: 如果这个特定序列是唯一一个缺少值的序列,我就可以使用For循环或pandas函数first\u valid\u index或isnull来解决它,如中所述,但这种情况很少发生Python 在数据帧中缺失的值中查找最接近的有效数字,python,pandas,Python,Pandas,我有一个数据集,其中有多个不同长度的缺失序列,我想找到在这些序列之前和之后出现的一些特定日期的第一个有效数字。在下面的样本数据集中,我想找到最接近2018-11-26日期的B列的有效数字 数据示例: 预期产出: 一些细节: 如果这个特定序列是唯一一个缺少值的序列,我就可以使用For循环或pandas函数first\u valid\u index或isnull来解决它,如中所述,但这种情况很少发生 我可以使用一些For循环来解决这个问题,但是对于更大的数据集来说速度非常慢,而且不太优雅,所以我真的
我可以使用一些For循环来解决这个问题,但是对于更大的数据集来说速度非常慢,而且不太优雅,所以我真的很想听听其他的建议 尝试这种方法,获取索引和切片以获取第一个有效数字
idx= np.where(df['Date']=='2018-11-26')[0][0]
# idx 3
num = (df.loc[df.loc[:idx,'ColumnB'].first_valid_index(),'ColumnB'],
df.loc[df.loc[idx:,'ColumnB'].first_valid_index(),'ColumnB'])
num
(80.0, 86.879999999999995)
您可以使用ffill和bfill创建两个列,其值来自前后,例如
df['before'] = df.ColumnB.ffill()
df['after'] = df.ColumnB.bfill()
然后使用loc获取所需日期的值
如果您有日期列表,则可以使用isin:
我会这样尝试:
import pandas as pd
import numpy as np
df_vld = df.dropna()
idx = np.argmin(abs(df_vld.index - pd.datetime(2018, 11,26)))
# 1
df_vld.loc[df_vld.index[idx]]
Out:
ColumnA 103.91
ColumnB 86.88
Name: 2018-11-29 00:00:00, dtype: float64
以下是一种方法:
t = '2018-11-26'
查找日期t的索引:
在B列中保留非空值的位置:
在顶部和下方获取最接近的非空值:
[df.loc[non_nulls[non_nulls < ix][-1],'ColumnB']] + [df.loc[non_nulls[non_nulls > ix][0],'ColumnB']]
[80.0, 86.88]
2018-11-16的接近值为80.00为什么会得到第二个值?哦我想你是在2018-11-26吗?@ScottBoston你完全正确!我已经编辑了这个问题。如果您想根据日期查找最近的非空数字,那么这实际上只是一个插值问题:df.set_index'Date'.ColumnB.interpolate'nearest'.ffill.bfill。如果只是基于索引的插值,则无需设置_index@ScottBoston希望这样更好。
list_dates = ['2018-11-26','2018-11-28']
print (df.loc[df.Date.isin(pd.to_datetime(list_dates)),['before','after']].values.tolist())
[[80.0, 86.88], [80.0, 86.88]]
import pandas as pd
import numpy as np
df_vld = df.dropna()
idx = np.argmin(abs(df_vld.index - pd.datetime(2018, 11,26)))
# 1
df_vld.loc[df_vld.index[idx]]
Out:
ColumnA 103.91
ColumnB 86.88
Name: 2018-11-29 00:00:00, dtype: float64
[df['ColumnB'].ffill().loc['2018-11-26'], df['ColumnB'].bfill().loc['2018-11-26']]
t = '2018-11-26'
ix = df.loc[df.Date==t].index.values[0]
non_nulls = np.where(~df.ColumnB.isnull())[0]
[df.loc[non_nulls[non_nulls < ix][-1],'ColumnB']] + [df.loc[non_nulls[non_nulls > ix][0],'ColumnB']]
[80.0, 86.88]