更改数据帧索引后,pandas版本0.16.0所有值都变为NaN

Yiy*_*ang 5 python ipython pandas

我正在使用ipython笔记本和以下pandas cookbook示例发布0.16.0.我在第237页时遇到麻烦.我制作了这样的数据帧

from pandas import *
data1=DataFrame({'AAA':[4,5,6,7],'BBB':[10,20,30,40],'CCC':[100,50,-30,-50]})
Run Code Online (Sandbox Code Playgroud)

然后,我做了这个,试图改变索引:

df=DataFrame(data=data1,index=(['a','b','c','d']))
Run Code Online (Sandbox Code Playgroud)

但我得到的是一个数据帧,所有值都是NaN!任何人都知道为什么以及如何解决它?我也尝试使用set_index函数,它给了我错误.

非常感谢你! 在此输入图像描述

EdC*_*ica 5

如果要更改索引,请使用reindex或直接分配给索引:

In [5]:

data1=pd.DataFrame({'AAA':[4,5,6,7],'BBB':[10,20,30,40],'CCC':[100,50,-30,-50]})
print(data1)
df=pd.DataFrame(data=data1)
df.index = ['a','b','c','d']
df
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50
Out[5]:
   AAA  BBB  CCC
a    4   10  100
b    5   20   50
c    6   30  -30
d    7   40  -50
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是一个错误,但如果您执行以下操作,它将起作用:

In [7]:

df=pd.DataFrame(data=data1.values,index=(['a','b','c','d']))
df
Out[7]:
   0   1    2
a  4  10  100
b  5  20   50
c  6  30  -30
d  7  40  -50
Run Code Online (Sandbox Code Playgroud)

因此,如果您将数据分配给值而不是 df 本身,则 df 不会尝试与传入的索引对齐

编辑

在单步执行此处的代码后,问题在于它使用传递的索引来重新索引 df,我们可以通过执行以下操作来重现此行为:

In [46]:

data1 = pd.DataFrame({'AAA':[4,5,6,7],'BBB':[10,20,30,40],'CCC':[100,50,-30,-50]})
data1.reindex_axis(list('abcd'))
Out[46]:
   AAA  BBB  CCC
a  NaN  NaN  NaN
b  NaN  NaN  NaN
c  NaN  NaN  NaN
d  NaN  NaN  NaN
Run Code Online (Sandbox Code Playgroud)

这是因为它进入 df 构造函数检测到它是一个实例BlockManager并尝试构造一个 df:

逐步执行代码,我看到它在 frame.py 中到达这里:

        if isinstance(data, BlockManager):
        mgr = self._init_mgr(data, axes=dict(index=index, columns=columns),
                             dtype=dtype, copy=copy)
Run Code Online (Sandbox Code Playgroud)

然后在 generic.py 中结束:

119         def _init_mgr(self, mgr, axes=None, dtype=None, copy=False):
120             """ passed a manager and a axes dict """
121             for a, axe in axes.items():
122                 if axe is not None:
123                     mgr = mgr.reindex_axis(
124  ->                     axe, axis=self._get_block_manager_axis(a), copy=False)
Run Code Online (Sandbox Code Playgroud)

一个问题现在已经张贴了关于这个

更新这是预期的行为,如果您传递索引,那么它将使用此索引重新索引来自@Jeff 的传入 df

这是定义的行为,将提供的输入重新索引到传递的索引和/或列。

查看相关问题