2015-06-19 47 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