将python数组与缺少的数据对齐

时间:2016-09-06 23:09:43

标签: python numpy

我有一些时间序列数据,比如说:

# [ [time] [ data ] ]
a = [[0,1,2,3,4],['a','b','c','d','e']]
b = [[0,3,4]['f','g','h']]

我想要一个带有一些填充值的输出,现在就说“无”:

a_new = [[0,1,2,3,4],['a','b','c','d','e']]
b_new = [[0,1,2,3,4],['f',None,None,'g','h']]

python / numpy中是否有内置函数来执行此操作(或类似的内容)?基本上我想拥有所有相同大小的时间向量,这样我就可以计算统计数据(np.mean)并相应地处理缺失的数据。

3 个答案:

答案 0 :(得分:4)

这个怎么样? (我假设你对b的定义是一个错字,我也假设你事先知道你想要多少条目。)

>>> b = [[0,3,4], ['f','g','h']]
>>> b_new = [list(range(5)), [None] * 5]
>>> for index, value in zip(*b): b_new[1][index] = value
>>> b_new
[[0, 1, 2, 3, 4], ['f', None, None, 'g', 'h']]

答案 1 :(得分:1)

smarx有一个很好的答案,但pandas完全是为了这样的事情。

# your data
a = [[0,1,2,3,4],['a','b','c','d','e']]
b = [[0,3,4],['f','g','h']]

# make an empty DataFrame (can do this faster but I'm going slow so you see how it works)
df_a = pd.DataFrame()
df_a['time'] = a[0]
df_a['A'] = a[1]
df_a.set_index('time',inplace=True)

# same for b (a faster way this time)
df_b = pd.DataFrame({'B':b[1]}, index=b[0]) 

# now merge the two Series together (the NaNs are in the right place)
df = pd.merge(df_a, df_b, left_index=True, right_index=True, how='outer') 

In [28]: df
Out[28]: 
     A    B
0    a    f
1    b  NaN
2    c  NaN
3    d    g
4    e    h

现在乐趣刚刚开始。在DataFrame中,您可以

  • 计算所有摘要统计信息(例如df.mean()

  • 制作地块(例如df.plot()

  • 基本上根据需要对数据进行切片/切块(例如df.groupby()

  • 使用指定的方法填写或删除缺失的数据(例如df.fillna()),

  • 采用季度或月度平均值(例如df.resample())等等。

如果您刚刚开始使用(对于您不喜欢的商业广告,请注意),我建议您阅读10 minutes to pandas以获得快速概述。

答案 2 :(得分:0)

这是一个矢量化的 NumPythonic 方法 -

def align_arrays(A):
    time, data = A

    time_new = np.arange(np.max(time)+1)

    data_new = np.full(time_new.size, None, dtype=object)
    data_new[np.in1d(time_new,time)] = data

    return time_new, data_new

样品运行 -

In [113]: a = [[0,1,2,3,4],['a','b','c','d','e']]

In [114]: align_arrays(a)
Out[114]: (array([0, 1, 2, 3, 4]), array(['a', 'b', 'c', 'd', 'e'], dtype=object))

In [115]: b = [[0,3,4],['f','g','h']]

In [116]: align_arrays(b)
Out[116]: (array([0, 1, 2, 3, 4]),array(['f', None, None, 'g', 'h'],dtype=object))