让我们考虑一下这个数据框:
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']])
值?
答案 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