Python Pandas对象将包含特殊字符的列名转换

3

I have a pandas dataframe structured like:

>>> df
   Col1  Col.With.Dots  Col.With.#  Col.With.%
0  text            111         111         111
1  text            222         222         222
2  text            333         333         333
3  text            444         444         444
4  text            555         555         555

当使用itertuples()迭代时,带有特殊字符的列会出错:
>>> for i in df.itertuples():
...    print i

Pandas(Index=0, Col1='text', _2=111, _3=111, _4=111)
Pandas(Index=1, Col1='text', _2=222, _3=222, _4=222)
Pandas(Index=2, Col1='text', _2=333, _3=333, _4=333)
Pandas(Index=3, Col1='text', _2=444, _3=444, _4=444)
Pandas(Index=4, Col1='text', _2=555, _3=555, _4=555)

在输出的打印结果中,"_2","_3","_4"应分别更改为“Col.With.Dots”,“Col.With.#”和“Col.With.%”。

我需要将 dataframe 对象转换为原始字典。 因此,每个Pandas对象都会更改为以下字典: {'Col1': 'text','Col.With.Dots':111,'Col.With.#':111,'Col.With.%':111}

有没有办法解决这个问题? 我做了一些研究,但找不到答案。


2
它们不是“损坏的”,它们是“已修复的”。Col.With.Dots和类似的变量名不是有效的Python标识符。Pandas正在尽力避免使用它们。 - DYZ
@DYZ 我明白,但我需要将这个结构转换为原始字典。 - Chen A.
为什么不重命名列? - Asterisk
@JohnGalt 将数据框转换为rawdict(字典列表),所以对于每个pandas对象,我都会得到一个字典{'Col1': 'text', 'Col.With.Dots':111,'Col.With.#':111... - Chen A.
@Asterisk 这是一个更大程序的一部分,我试图避免修改头文件。使用 csv 模块可以正常工作,但当 csv 文件大小变得很大(500mb+)时,它会失败,而 pandas 可以成功加载该文件。 - Chen A.
1个回答

1
使用to_dict()
In [1659]: df.to_dict('r')
Out[1659]:
[{'Col.With.#': 111L, 'Col.With.%': 111L, 'Col.With.Dots': 111L, 'Col1': 'text'},
 {'Col.With.#': 222L, 'Col.With.%': 222L, 'Col.With.Dots': 222L, 'Col1': 'text'},
 {'Col.With.#': 333L, 'Col.With.%': 333L, 'Col.With.Dots': 333L, 'Col1': 'text'},
 {'Col.With.#': 444L, 'Col.With.%': 444L, 'Col.With.Dots': 444L, 'Col1': 'text'},
 {'Col.With.#': 555L, 'Col.With.%': 555L, 'Col.With.Dots': 555L, 'Col1': 'text'}]

或者,对于循环,可以使用 df.iterrows()to_dict()
In [1667]: for i, x in df.iterrows():
      ...:     print x.to_dict()
      ...:
{'Col.With.%': 111L, 'Col.With.Dots': 111L, 'Col.With.#': 111L, 'Col1': 'text'}
{'Col.With.%': 222L, 'Col.With.Dots': 222L, 'Col.With.#': 222L, 'Col1': 'text'}
{'Col.With.%': 333L, 'Col.With.Dots': 333L, 'Col.With.#': 333L, 'Col1': 'text'}
{'Col.With.%': 444L, 'Col.With.Dots': 444L, 'Col.With.#': 444L, 'Col1': 'text'}
{'Col.With.%': 555L, 'Col.With.Dots': 555L, 'Col.With.#': 555L, 'Col1': 'text'}

这个很好用,谢谢。顺便问一下 - 在转换之前有没有办法将值从float更改为int? - Chen A.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接