我仍然在學習大熊貓,並有2列的熊貓數據幀:大熊貓列值拆分到新列,如果如下圖所示列表
actual label pred label
0 -1
0 -1
1 [1, 0.34496911461303364]
1 -1
我想什麼做到的是,如果在「一個值Pred標籤'是一個列表,用於獲取列表中的第一個值(在本例中爲1),並將其保留在列中,然後獲取列表中的第二個值並將其放入其自己的列'pred score'中。
我仍然在學習大熊貓,並有2列的熊貓數據幀:大熊貓列值拆分到新列,如果如下圖所示列表
actual label pred label
0 -1
0 -1
1 [1, 0.34496911461303364]
1 -1
我想什麼做到的是,如果在「一個值Pred標籤'是一個列表,用於獲取列表中的第一個值(在本例中爲1),並將其保留在列中,然後獲取列表中的第二個值並將其放入其自己的列'pred score'中。
如果可以避免的話,首先將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
這裏有一種方法來實現它
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
您可以同時使用列表理解與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
這裏的另一種方法
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
pred列中的「list」實際上是列表還是列表的字符串表示? – DSM