2015-06-19 45 views
1

我仍然在学习大熊猫,并有2列的熊猫数据帧:大熊猫列值拆分到新列,如果如下图所示列表

actual label   pred label 
    0     -1 
    0     -1 
    1   [1, 0.34496911461303364] 
    1     -1 

我想什么做到的是,如果在“一个值Pred标签'是一个列表,用于获取列表中的第一个值(在本例中为1),并将其保留在列中,然后获取列表中的第二个值并将其放入其自己的列'pred score'中。

+0

pred列中的“list”实际上是列表还是列表的字符串表示? – DSM

回答

2

如果可以避免的话,首先将DataFrame存储为初始格式可能不是一个好主意。这里是一个解决方案:

import pandas as pd 

df = pd.DataFrame({'actual_label' : [0,0,1,1], 
        'pred_label' : [-1,-1, [1, 0.34496911461303364], -1]}) 

def split_label(v): 
    if isinstance(v, list): 
    return pd.Series(v, index = ['pred_label', 'pred_score']) 
    return pd.Series(v, index = ['pred_label']) 

new_pred = df.pred_label.apply(split_label) 
df_new = pd.concat([df.actual_label, new_pred], axis=1) 

最终输出看起来是这样的:

actual_label pred_label pred_score 
0    0   -1   NaN 
1    0   -1   NaN 
2    1   1 0.344969 
3    1   -1   NaN 
2

这里有一种方法来实现它

In [74]: df 
Out[74]: 
    actual label pred label 
0   0   -1 
1   0   -1 
2   1 [1, 0.344] 
3   1   -1 

使用apply检查,如果值列表isinstance(x,list),并采取了值,然后apply(pd.Series, 1)拆分为列

In [75]: (df['pred label'].apply(lambda x: x if isinstance(x,list) else [x, np.nan]) 
          .apply(pd.Series, 1)) 
Out[75]: 
    0  1 
0 -1 NaN 
1 -1 NaN 
2 1 0.344 
3 -1 NaN 

您可以分配这两列返回df带列['pred-lab', 'pred-score']

In [76]: df[['pred-lab', 'pred-score']] = (df['pred label'].apply(lambda x: x if isinstance(x,list) else [x, np.nan]) 
                  .apply(pd.Series, 1)) 

最终df看起来像

In [77]: df 
Out[77]: 
    actual label pred label pred-lab pred-score 
0   0   -1  -1   NaN 
1   0   -1  -1   NaN 
2   1 [1, 0.344]   1  0.344 
3   1   -1  -1   NaN 
1

您可以同时使用列表理解与isinstance测试是否在pred_label对象是一个列表。

df['pred score'] = [c[1] if isinstance(c, list) else None for c in df['pred label']] 
df['pred label'] = [c[0] if isinstance(c, list) else c for c in df['pred label']] 
>>> df 
    actual label pred label pred score 
0    0   -1   NaN 
1    0   -1   NaN 
2    1   1 0.344969 
3    1   -1   NaN 
1

这里的另一种方法

d = {"actual label" : [0,0,1,1], "pred label" : [-1,-1,[1, 0.34496911461303364],-1]} 
df = pd.DataFrame(d) 

假设“预见标签”是类型的对象,并使用布尔索引。想知道是否有更好的方式来索引到列表中比我在这里做的更好

filter = df["pred label"].str.len() == 2 
df.loc[filter,"pred score"] = df[filter]["pred label"].tolist()[0][1] 
df.loc[filter,"pred label"] = df[filter]["pred label"].tolist()[0][0] 
print(df) 
    actual label pred label pred score 
0    0   -1   NaN 
1    0   -1   NaN 
2    1   1 0.344969 
3    1   -1   NaN