2017-04-21 103 views
1

我是熊猫新手。我需要阅读xlsx文件并使用pandas将第一列转换为字典和第二列的键值,作为字典的值。我还需要跳过/排除第一行是标题。pandas:读取xlsx文件,以第1列作为键和第2列作为值

答案here用于pymysqlhere用于csv。我需要用户pandas

这里是一个示例Excel数据

dict_key dict_value 
key1  str_value1 
key2  str_value2 
key3   None 
key4   int_value3 

到目前为止我的代码如下所示。

import pandas as pd 

excel_file = "file.xlsx" 
xls = pd.ExcelFile(excel_file) 
df = xls.parse(xls.sheet_names[0], skiprows=1, index_col=None, na_values=['None']) 
data_dict = df.to_dict() 

但是,它给了我字典,其中的键是列号和值都是列1数据以及列2数据。

>>> data_dict 
{u'Chg_Parms': {0: u' key1 ', 1: u' key2 ', 2: u' key3 ', 3: u' key4 ', 4: u' str_value1 ', 
       5: u' str_value2 ', 6: u' Nan ', 6: u' int_value3 '}} 

我想什么已经是COLUMN1数据作为关键和列两个数据的值,也NaNNone

data_dict = {'key1': 'str_value1', 'key2': 'str_value2', 'key3': None, 'key4': int_value3} 

感谢您的帮助更换。

回答

1

您可以使用collections.OrderedDict来保持键的顺序。您会注意到pd.read_excel默认加载第一张纸。编辑:那么,你说你要在编码字典中的项目,并评估'None'None ...

import collections as co 
import pandas as pd 

df = pd.read_excel('file.xlsx') 
df = df.where(pd.notnull(df), None) 
od = co.OrderedDict((k.strip().encode('utf8'),v.strip().encode('utf8')) 
        for (k,v) in df.values) 

结果:

>>> od 
OrderedDict([(u'key1', u'str_value1'), (u'key2', u'str_value2'), (u'key3', u'None'), (u'key4', u'int_value3')]) 

一般注意事项:请妥善保管字符串为Unicode中的Python程序。

+0

@伯尼感谢。这绝对是我所需要的。但是,如何将每个键值转换为非unicode表示形式,去掉空白区域并保持其类型。例如。 str(u'1')的结果为'1',str(u'None')的结果为'None'。我需要'int'和'boolean'值。 –

+0

@Anil_M:你非常欢迎。请参阅编辑答案。 – bernie

+0

我在编码('utf8')旁边添加了.strip()来处理空白。我相信我的问题。谢谢。 –

2

您可以使用pandas read_excel方法更方便地读取excel文件。您可以传递一个index_col参数,您可以在其中定义您的xlsx的哪一列是索引。

如何将NaN更改为无,在此question中解释。

鉴于称为example.xlsx一个XLSX文件,该文件是建立一个像你上面写的,下面的代码应该给你的预计业绩:为俺们

import pandas as pd 

df = pd.read_excel("example.xlsx", index_col=0) 
df = df.where(pd.notnull(df), None) 

print df.to_dict()["dict_value"] 
+0

'df = df.where(pd.notnull(df),None)'nice one,+1 – bernie

相关问题