如果有人问过类似的问题,我深表歉意-我仔细研究了很多,但与我的特定问题不符。
基本上,我有一个包含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"
}
答案 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']]
然后只会选择姓名和电子邮件