Pandas数据帧:根据行级别的排名分配值

时间:2016-03-25 10:26:27

标签: python pandas

考虑以下pandas数据帧(df):

index    A      B      C      D      E      F      G      weights

1        NaN    1      NaN    NaN    NaN    3      2      [0.6 , 0.2 , 0.2]
2        3      2      NaN    1      NaN    NaN    NaN    [0.5 , 0.4 , 0.1]
3        NaN    NaN    1      2      3      NaN    NaN    [0.8 , 0.1 , 0.1]
4        NaN    3      1      NaN    NaN    2      NaN    [0.9 , 0.1 , 0.0]

所需输出(与行级相应权重匹配的值):

1        NaN    0.6    NaN    NaN    NaN    0.2    0.2
2        0.1    0.4    NaN    0.5    NaN    NaN    NaN
3        NaN    NaN    0.8    0.1    0.1    NaN    NaN
4        NaN    0.0    0.9    NaN    NaN    0.1    NaN

我目前的解决方案:

def assign_weights(row):
    for i in range(1,4):
        row.replace(i, row.weights[i-1], inplace=True)
    return row

df.apply(assign_weights, axis = 1)

是否有更快的方法(对于要分配更多权重的大数据帧)?

1 个答案:

答案 0 :(得分:1)

不确定这是否会更快:

>>> def worker(row):
...     n = np.array(row['weights'])
...     i = (row.notnull()) & (row.index != 'weights')
...     row[i] = n[row[i].astype('int').values - 1]
...     return row
>>>
>>> df.apply(worker, axis=1)
         A    B    C    D    E    F    G          weights
index                                                    
1      NaN  0.6  NaN  NaN  NaN  0.2  0.2  [0.6, 0.2, 0.2]
2      0.1  0.4  NaN  0.5  NaN  NaN  NaN  [0.5, 0.4, 0.1]
3      NaN  NaN  0.8  0.1  0.1  NaN  NaN  [0.8, 0.1, 0.1]
4      NaN  0.0  0.9  NaN  NaN  0.1  NaN  [0.9, 0.1, 0.0]