gpt4 book ai didi

python - 在Python3中为DataFrame创建列名的问题

转载 作者:行者123 更新时间:2023-11-30 22:25:02 26 4
gpt4 key购买 nike

我不明白为什么“u”有 NaN 值。我在这里做错了什么?

>>> z=pd.DataFrame([['abcb','asasa'],['sdsd','aeio']])
>>> z
0 1
0 abcb asasa
1 sdsd aeio
>>> u=pd.DataFrame(z,columns=['hello','ajsajs'])
>>> u
hello ajsajs
0 NaN NaN
1 NaN NaN

最佳答案

替代构造调用

您可以使用底层 NumPy 数组:

u = pd.DataFrame(z.values, columns=['hello','ajsajs'])

hello ajsajs
0 abcb asasa
1 sdsd aeio

或者,您可以使用:

u = z.rename(columns={0: 'hello',1: 'ajsajs'})

最后按照@Dark的建议:

u = z.set_axis(['hello','ajsajs'], axis=1, inplace=False)

关于 set_axis 中的 inplace 的小注释 -

WARNING: inplace=None currently falls back to to True, but in a future version, will default to False. Use inplace=True explicitly rather than relying on the default.

在 pandas 0.20.3 中,语法如下:

u = z.set_axis(axis=1, labels=['hello','ajsajs'])

@Dark 的解决方案在这里显得最快。

为什么当前方法不起作用

我认为这里的问题是,当以这种方式构造 DataFrame 时,会调用 .reindex 。这是一些源代码,其中省略号表示我省略的不相关内容:

from pandas.core.internals import BlockManager

# pandas.core.frame.DataFrame
class DataFrame(NDFrame):
def __init__(self, data=None, index=None, columns=None, dtype=None,
copy=False):
# ...
if isinstance(data, DataFrame):
data = data._data
if isinstance(data, BlockManager):
mgr = self._init_mgr(data, axes=dict(index=index, columns=columns),
dtype=dtype, copy=copy)
# ... a bunch of other if statements irrelevant to your case
NDFrame.__init__(self, mgr, fastpath=True)
# ...

这里发生了什么:

  • DataFrame 继承自一个更通用的基类,该基类又具有多重继承。 (Pandas 很棒,但它的来源可能就像试图通过蜘蛛网回溯。)
  • u = pd.DataFrame(z,columns=['hello','ajsajs']) 中,x 是一个 DataFrame。因此,下面的第一个 if 语句为 True,且 data = data._data。什么是_data?这是BlockManager .*(下面继续...)
  • 因为我们刚刚转换了您传递给其 BlockManager 的内容,所以下一个 if 语句的计算结果也为 True。然后,mgr 被分配给 _init_mrg 方法的结果,并且调用父类的 __init__,传递 mgr

* 使用 isinstance(z._data, BlockManager) 进行确认。

现在进入第二部分...

# pandas.core.generic.NDFrame
class NDFrame(PandasObject, SelectionMixin):
def __init__(self, data, axes=None, copy=False, dtype=None,
fastpath=False):
# ...

def _init_mgr(self, mgr, axes=None, dtype=None, copy=False):
""" passed a manager and a axes dict """
for a, axe in axes.items():
if axe is not None:
mgr = mgr.reindex_axis(axe,
axis=self._get_block_manager_axis(a),
copy=False)
# ...
return mgr

这里是定义_init_mgr的地方,它在上面被调用。基本上就您的情况而言,您有:

columns=['hello','ajsajs']
axes=dict(index=None, columns=columns)
# ...

当您重新索引轴并指定一个新轴(其中旧对象中不包含任何新标签)时,您将得到所有 NaN。这似乎是一个经过深思熟虑的设计决策。考虑这个相关示例来证明这一点,其中一个新列存在,一个不存在:

pd.DataFrame(z, columns=[0, 'ajsajs'])

0 ajsajs
0 abcb NaN
1 sdsd NaN

关于python - 在Python3中为DataFrame创建列名的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47655393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com