如果列表,Pandas会将列值拆分为新列

时间:2015-06-19 14:16:35

标签: python pandas

我还在学习大熊猫,并且有一个包含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,并将其保留在列中,然后将列表中的第二个值放入其自己的列“预测得分”中。

4 个答案:

答案 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