从Excel中提取两列,然后将键值对附加到字典中

时间:2019-06-20 17:20:55

标签: python excel pandas

如果有人问过类似的问题,我深表歉意-我仔细研究了很多,但与我的特定问题不符。

基本上,我有一个包含2列的Excel电子表格;名称和电子邮件。我正在使用pandas从文件中抓取两列。我想按顺序从列中获取值,并将其附加到字典中,以便以后可以轻松地引用名称和电子邮件对。

我目前在两个文件中有两个功能。一个是我的main文件/函数,另一个是名为readExcel的文件,其功能为read

# readExcel.py
import pandas as pd

def read(fileName: str, sheetName: str):
    f = pd.read_excel(fileName, sheet_name = sheetName)
    return f

# __main__.py
import readExcel as re

from pathlib import Path

def main():
    contacts = {}

    p = Path(__file__).with_name('contacts.xlsx')
    f = re.read(p, "Sheet1")

    for n in f["Name"]:
        for e in f["Email"]:
            contacts[n] = e

    print(contacts)

我在这里面临的问题是生成的字典是无序的,例如Bob Testerson: jim.tester@gmailcom, Jim Tester: bob.testerson@gmail.com

如何正确排序从电子表格中提取的数据?

编辑:根据请求,我将添加有关Excel文件和首选顺序的更多信息。

Excel文件如下所示: Excel image preview

对于数据的排序,似乎最好在将其添加到字典之前完成,但这对我来说不是必需的。另外,我并不特别在意键/值对在字典中的显示顺序,而是键/值对在Excel文件中的显示方式与它们类似,例如

{
    "Jon Testerson": "jon.test@gmail.com", 
    "Henry": "henrytest@gmail.com", 
    "Bryce Testington": "brycetestington@gmail.com", 
    "Greg": "greg_test@yahoo.com", 
    "Jerry Testerfield", "jerrytester@hotmail.com"
}

2 个答案:

答案 0 :(得分:1)

使用pandas dict方法尝试此操作。只需更改列名称即可。

import pandas as pd

def read_excel(path_to_file):

    df = pd.read_excel(path_to_file)

    return df

def dataframe_to_dict(df, key_column, value_column):

    name_email_dict = df.set_index(key_column)[value_column].to_dict()

    return name_email_dict

if __name__ == "__main__":

    path_to_file = 'C:\projects\scratchwork\excel_dict.xlsx'

    df = read_excel(path_to_file)

    name_email_dict = dataframe_to_dict(df,'Name','Email')

    print(name_email_dict)

答案 1 :(得分:0)

我敢肯定有一种更简单的方法,但是我会将数据放入数据框中,然后使用sort_values方法对它们进行排序。看起来像这样:

# readExcel.py
import pandas as pd

def read(fileName: str, sheetName: str):
  f = pd.read_excel(fileName, sheet_name = sheetName)
  return f

# __main__.py
import readExcel as re

from pathlib import Path

def main():
  df = pd.DataFrame()
  contacts = {}

 p = Path(__file__).with_name('contacts.xlsx')
 f = re.read(p, "Sheet1")
 df = df.append(f,ignore_index=True)

print(df.sort_values(by=["Name","Email"]))

再做可能不是最好的方法,但是如果在工作表1上有额外的信息,那么它应该可以工作,然后在打印之前我会这样做:

df = df[['Name','Email']]

然后只会选择姓名和电子邮件