Python 熊猫和努比

Python 熊猫和努比,python,pandas,numpy,Python,Pandas,Numpy,我很难做到以下几点。我有一个名为p的pandasnxd数据帧,其中缺少一些(NAN)值。我有另一个对应的数组,它的索引是dxkxt。我想把数据框中的每只熊猫的条目n,d映射到a[d][k][p[n,d]]以获得所有可能的k,从而形成n x d x k矩阵。我可以得到一些帮助,如何在熊猫和Numpy图书馆最有效地完成这项工作 实际上,然后我取最终矩阵的nxd部分,沿着列取乘积,留下一个nxk矩阵。最终输出可通过以下方式(缓慢)再现: def generate_entry(i, j):

我很难做到以下几点。我有一个名为
p
的pandas
nxd
数据帧,其中缺少一些(
NAN
)值。我有另一个对应的数组,它的索引是
dxkxt
。我想把数据框中的每只熊猫的条目
n,d
映射到
a[d][k][p[n,d]]
以获得所有可能的k,从而形成
n x d x k
矩阵。我可以得到一些帮助,如何在熊猫和Numpy图书馆最有效地完成这项工作

实际上,然后我取最终矩阵的
nxd
部分,沿着列取乘积,留下一个
nxk
矩阵。最终输出可通过以下方式(缓慢)再现:

    def generate_entry(i, j):
        result = np.prod([alpha[s][j][int(p.loc[i][s])] for s in range(num_features) if not isNaN(p.loc[i][s]) ])
        return result

    vgenerate_entry = np.vectorize(generate_entry)
    result = np.fromfunction(vgenerate_entry, shape=(len(p), k), dtype=int)
我认为使用熊猫玩具会有助于矩阵乘法,但我不太明白这一点

下面的步骤要快得多:

    r = None
    for i in range(num_features):
        rel_data = pd.get_dummies(data.ix[:,i])
        rel_probs = alpha[i].T
        prod = rel_data.dot(rel_probs)
        prod[prod == 0] = 1
        if r is None:
            r = prod
        else:
            r = r.multiply(prod)

    r = r.as_matrix()
    r = r * pi
    posteriers = r / np.sum(r, axis=1)[:, np.newaxis]

这里有一种方法可以使用pandas数据帧
p
索引NumPy数组
a
,该数据帧具有
nan
,这是需要避免的,我们正在这些地方填充一些值
fillval
-

def fancy_indexing_avoid_NaNs(p, a, fillval = 1):
    # Extract values from p and get NaN mask
    pv = p.values
    mask = np.isnan(pv)

    # Get int version, replacing NaNs with some number, say 0
    p_idx = np.where(mask, 0, pv).astype(int)

    # FANCY-INDEX into array 'a' with those indices fron p
    a_indexed_vals = a[np.arange(D), np.arange(K)[:,None,None],p_idx]

    # FANCY-INDEX once more to replace the values set by NaNs as 1s, so
    # that in the prod-reduction later on they would have no effect
    a_indexed_vals[np.arange(K)[:,None,None],mask] = fillval
    return a_indexed_vals
fillval
将取决于应用程序。在本例中,我们使用的是
prod
,因此
fillval=1
是有意义的,它不会影响结果

OP发布的原始方法-

def generate_entry(i, j):
    result = np.prod([a[s][j][int(p.loc[i][s])] for s in range(D) \
                                   if not np.isnan(p.loc[i][s]) ])
    return result

vgenerate_entry = np.vectorize(generate_entry)
样本运行-

In [154]: N,D,K,T = 3,4,5,6
     ...: a = np.random.randint(0,5,(D,K,T))
     ...: 
     ...: p = pd.DataFrame(np.random.randint(0,T,(N,D)).astype(float))
     ...: p.iloc[2,3] = np.nan
     ...: p.iloc[1,2] = np.nan
     ...: 

In [155]: result = np.fromfunction(vgenerate_entry, shape=(len(p), K), dtype=int)

In [156]: a_indexed_vals = fancy_indexing_avoid_NaNs(p, a)

In [157]: out = a_indexed_vals.prod(2).T

In [158]: np.allclose(out, result)
Out[158]: True

是的,只是很慢。你能分享一下吗?您打算如何避免
p
/中的nan?与这些nan相对应的输出必须是什么?如果p[n,d]是nan,则地图应该转到nan。共享循环代码?共享和修改