为什么在使用pd.Dataframe()创建数据框并手动设置索引时使用NaN?

时间:2017-09-02 14:37:37

标签: python pandas numpy

让我们考虑一下这个数据框:

size_t strnlen(const char *str, size_t len)
{
    for (size_t size = 0; size < len; size++)
    {
        if (str[size] == '\0')
            return size;
    }
    return len;
}

现在让我们说我们要选择两列,并使用另一列作为索引。我们可以使用df = pd.DataFrame(np.random.rand(4,4), columns = ['A', 'B', 'AB', 'O']) df Out[1]: A B AB O 0 0.704744 0.032988 0.514788 0.405281 1 0.978119 0.354312 0.273255 0.908691 2 0.653161 0.337653 0.309225 0.008059 3 0.023022 0.110995 0.751048 0.088853 并轻松完成,但让我们尝试一种更加繁琐的方法,并使用set_index()

pd.DataFrame()

为什么会产生pd.DataFrame(df[['B','AB']], index = df['A'].values) Out[2]: B AB 0.704744 NaN NaN 0.978119 NaN NaN 0.653161 NaN NaN 0.023022 NaN NaN 值?

如果我将整数列表作为索引传递(例如NaN),则会出现同样的问题。

我们可以通过将数据作为index = [10,11,12,13]传递numpy.ndarray来轻松解决此问题。不会以这种方式显示df[['B','AB']].values值。

此外,NaN没有显示NaN值,其中不再指定索引。

但是,再次,为什么上面代码的pd.DataFrame(df[['B','AB']])值?

1 个答案:

答案 0 :(得分:2)

如果您将数据帧作为DataFrame构造函数的第一个参数传递,它将构造一个具有给定索引的新数据帧,并且指定原始数据帧中的值,前提是该索引具有值

例如,如果你写:

pd.DataFrame(df[['B','AB']],index=[0,2])

它将选择第一行和第三行:

          A         B        AB         O
0  0.501622  0.422913  0.570804  0.507912
1  0.507934  0.698122  0.745761  0.201501
2  0.333501  0.567291  0.472924  0.813184
3  0.788795  0.733176  0.843651  0.603158
>>> pd.DataFrame(df[['B','AB']],index=[0,2])
          B        AB
0  0.422913  0.570804
2  0.567291  0.472924

由于浮点数没有值(例如问题0.704744),因此会使用NaN s填充缺失值。

然而,您可以通过写作轻松获得所需内容:

>>> df[['A', 'B', 'AB']].set_index('A')
                 B        AB
A                           
0.501622  0.422913  0.570804
0.507934  0.698122  0.745761
0.333501  0.567291  0.472924
0.788795  0.733176  0.843651