【问题标题】:read_csv columns encodingread_csv 列编码
【发布时间】:2014-02-25 00:29:23
【问题描述】:

我对 python 很陌生。

我正在尝试使用 python 自动化一些建筑能耗数据的数据分析。 我正在使用python 2.7.3pandas 0.12Canopy with qtconsole

这些是我正在遵循的步骤:

  1. 将模拟软件中的数据粘贴到 excel 中
  2. 从 Excel 导出为 csv
  3. 在熊猫dataframe中导入csv
  4. 执行我的分析

在交互式控制台中我编写了以下代码

import pandas as pd
rooms = pd.read_csv('IES Results - Rooms.csv', index_col='Room # (Real)')
systems = pd.read_csv('IES Results - Systems.csv',index_col='Room #')
all_values = pd.concat([rooms,systems],axis=1)
all_values = all_values.T.drop_duplicates().T
columns = [u'Room ID',u'Room Name',u'Floor Area (m²) (Real)',u'Volume (m³) (Real)']
selected_values = all_values[columns]

不幸的是,我收到以下错误

KeyError: "[u'Floor Area (m\\xb2) (Real)' u'Volume (m\\xb3) (Real)'] not in index"

正如您所见,所有带有上标的列都没有正确解释,并且在dataframe 中找不到它们。

当我写作时

all_values.columns

列标题在IPython 控制台中正确显示。然后我复制并粘贴我感兴趣的值以创建“列”列表以传递给'selected_values = all_values[columns]'

我已经做了很多研究,但我无法理解它。

我试图指定各种编码,但我并不真正理解它发生了什么。

我被困了一天多。

你能帮忙吗?

【问题讨论】:

  • 要从编码(在 csv 文件中)到 Unicode(在程序中),您需要使用 encoding 关键字参数到 pd.read_csv pandas.pydata.org/pandas-docs/stable/generated/…
  • 嗨,我想尝试重现这个,但我无法让 Excel 导出为带有上标的 CSV。您能否查看您的 CSV 文件并告诉我上标是如何显示的?
  • 嗨,我只是“另存为”csv。我试图用记事本++打开文件,我看到了上标。我在 Windows 7 64bit 中使用 Excel 2010
  • 我认为问题在于我用来创建“列”列表的复制和粘贴。如果我在创建列表后打印它,我会丢失上标。
  • @bernie 我尝试使用关键字,但没有区别。我已经从 Libre 以 UTF-8 格式保存了 csv,并使用了 encoding='UTF-8'。

标签: python csv encoding pandas


【解决方案1】:

好吧,如果我在做这样的事情,

1) 摆脱 Excel。 - 你需要它吗。为什么你的模拟程序不转储它自己的数据?如果不能而不是粘贴到 Excel,将其粘贴到 txt 文件并从 Python 解析它

2)摆脱上标 - 你真的需要上标吗?我会删除那些,至少在我的分析阶段,当需要某种演示时,我会恢复那些。

【讨论】:

  • 感谢您的回答。我试图将内容粘贴到使用 Notepadd++ 创建的 csv 文件中。结果相同。
  • 我们可以看一个文件内容的例子吗?你试过去掉上标吗?
  • 不,我没有。我想尽量减少对文件的手动干预。这是文件dropbox.com/s/p0tgb4hzg9aokis/IES%20Results%20-%20SO.csv
  • 在使用 pandas 之前,我会在 python 中剥离它们
【解决方案2】:

经过一些测试,我发现问题出在我用来创建“列”的复制和粘贴中。

比较差异。

此“列”是通过复制和粘贴创建的

columns_cp = [u'Room ID',u'Room Name',u'Floor Area (m²) (Real)',u'Volume (m³) (Real)']
columns_cp
Out[29]: 
[u'Room ID',
 u'Room Name',
 u'Floor Area (m\xb2) (Real)',
 u'Volume (m\xb3) (Real)']

如您所见,格式已消失。 m\xb2 和 m\xb3 不正确。

以下是更好的方法

columns = [all_values.columns.tolist()[i] for i in [0,1,8,11]]

其中 0,1,8,11 是我感兴趣的列。 这是列的输出

columns
Out[30]: 
['Room ID',
 'Room Name',
 'Floor Area (m\xc2\xb2) (Real)',
 'Volume (m\xc2\xb3) (Real)']

正如你所见,编码并没有丢失,确实:

selected_values = all_values[columns]
In [32]: selected_values
Out[32]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 288 entries, 0 to 457
Data columns (total 4 columns):
Room ID                   288  non-null values
Room Name                 288  non-null values
Floor Area (m²) (Real)    288  non-null values
Volume (m³) (Real)        288  non-null values
dtypes: object(4)

它按我的预期工作并且上标没有丢失。

干杯

【讨论】:

    猜你喜欢
    • 2018-06-02
    • 2015-04-03
    • 2015-08-08
    • 1970-01-01
    • 2020-09-20
    • 2015-06-28
    • 2019-07-19
    • 2020-09-21
    相关资源
    最近更新 更多