我仍然在学习大熊猫,并有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