我还在学习大熊猫,并且有一个包含2列的pandas数据框,如下所示:
public static int GetPower(int base, int power)
{
int result = 1;
for(int i = 1; i<=power; i++)
{
result *= base;
if (result < 0 ) {
break; // not very acurate
}
}
if (result < 0 ) {
return -1;
}
return result;
}
我想要实现的是,如果某个值在&#39; pred标签&#39;是一个列表,用于获取列表中的第一个值,在本例中为1,并将其保留在列中,然后将列表中的第二个值放入其自己的列“预测得分”中。
答案 0 :(得分: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 :(得分:2)
如果可以避免,首先将DataFrame以这种初始格式存储可能不是一个好主意。这是一个解决方案:
actual_label pred_label pred_score
0 0 -1 NaN
1 0 -1 NaN
2 1 1 0.344969
3 1 -1 NaN
最终输出如下:
{{1}}
答案 2 :(得分: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
答案 3 :(得分:1)
这是另一种方法
d = {"actual label" : [0,0,1,1], "pred label" : [-1,-1,[1, 0.34496911461303364],-1]}
df = pd.DataFrame(d)
假设&#34; pred标签&#34;是object类型并使用布尔索引。想知道是否有更好的方式来索引列表而不是我在这里做的
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