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函数,它给了我错误.
非常感谢你!

如果要更改索引,请使用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
这是定义的行为,将提供的输入重新索引到传递的索引和/或列。
查看相关问题
| 归档时间: |
|
| 查看次数: |
2464 次 |
| 最近记录: |