使用Pandas在Python中读取和写入列数据

问题描述 投票:0回答:2

这项努力是美妙的Mac Model Shelf的变化。到目前为止,我已经设法自己编写代码,可以在命令行中读取单个Mac序列号,并根据序列中的最后3或4个字符返回相应的模型类型。

现在写我正在尝试编写一个脚本来读入Excel文件中的列数据,并返回相邻列中每个单元格的结果。

输出Excel有望看起来像这样(带标题)......

Serial         Model
C12PT70EG8WP   Macbook Pro 2015 15" 2.5 Ghz i7
K12PT7EG0PW    iMac 2010 Intel Core Duo 1.6 Ghz

这都是基于excel文件,它将数据提供给python shelve。以下是它如何读取的一个小例子...我在主代码中称它为“pgList.xlsx”。实际上它将长达数百行。

G8WP   Macbook Pro 2015 15" 2.5 Ghz i7
0PW    iMac 2010 Intel Core Duo 1.6 Ghz
3RT    iPad Pro 2017

主要的python3代码......

import shelve
import pandas as pd

#getting the shelve/database ready from the library excel file
DBPATH = "/Users/me/PycharmProjects/shelve/macmodelshelfNEW"
databaseOfMacs = shelve.open(DBPATH) 
excelDict = pd.read_excel('pgList.xlsx', header=None, index_col=0,squeeze=True).to_dict()
databaseOfMacs.update(excelDict)

#loading up the excel file and serial numbers I want to examine...
df = pd.read_excel('testSerials.xlsx', sheet_name='Sheet1')
listSerials = df['Serial']
listModels = df['Model']

for i in listSerials:
    inputSerial = i
    inputSerial = inputSerial.upper()

    modelCodeIsolatedFromSerial = ""   

    if len(inputSerial) == 12:
        modelCodeIsolatedFromSerial = inputSerial[-4:]
    elif len(inputSerial) == 11:
        modelCodeIsolatedFromSerial = inputSerial[-3:]


    try:
        model = databaseOfMacs[modelCodeIsolatedFromSerial]
        #printing to console to check code works
        print(model)

    except:
        print("Result not found")

databaseOfMacs.clear()
databaseOfMacs.close()

你能帮我把结果写回同一个excel文件吗?例如,如果序列号在单元格A2中,结果(模型类型)将写入B2?

我已经尝试在代码中的主'for'循环之前包含这行代码,但它只用于在运行脚本后将Excel文件清空!我暂时评论一下。

writer = pd.ExcelWriter('testSerials.xlsx', engine='xlsxwriter')

你能帮我处理序列栏中任何可能的空白单元吗?空白将丢弃此错误。

AttributeError: 'float' object has no attribute 'upper'

再次感谢您照顾我!

WL

UPDATE

我到目前为止的评论确实有帮助。我认为我陷入困境的部分是获取'for'循环的输出,在这种情况下'model'进入'Models'的列。变量'listModels'似乎与Python 3中的其他列表不同,即我无法向它添加任何内容。

更新2

还有一些修改,试图将“Serial”列中值的序列号查找结果导入“Model”列。

我试过了(没有任何真正的成功)

    try:

        model = databaseOfMacs[modelCodeIsolatedFromSerial]

        print(model)

        listModels.replace(['nan'], [model], inplace=True)

这不会给我一个错误信息,但输出的excel文件中仍然没有任何内容。

当我运行for循环来打印'listModels'的内容时,我只是回复了一个“NaN”列表,建议什么都没有改变......真糟糕!

我也试过了

try:

    model = databaseOfMacs[modelCodeIsolatedFromSerial]

    print(model)

    listModels[i] = model

这将吐出一个控制台错误

A value is trying to be set on a copy of a slice from a DataFrame

但是,当我遍历'listModels'时,至少我可以在控制台中看到与序列号相关的型号名称,但输出的Excel文件中仍然没有(对于每个被检查的序列号都有'nan')

我确信我在代码中缺少一些小东西来解决这个问题。再次感谢任何可以帮助我的人。

更新3

我自己解决了这个问题。只需使用while循环代替。

sizeOfSerialsList = len(listSerials)

count = 0


while (count < sizeOfSerialsList):
    inputSerial = listSerials.iloc[count]
    inputSerial = str(inputSerial).upper()
    modelCodeIsolatedFromSerial = ""
    model = ""


    if len(inputSerial) == 12:
        modelCodeIsolatedFromSerial = inputSerial[-4:]
    elif len(inputSerial) == 11:
        modelCodeIsolatedFromSerial = inputSerial[-3:]

    try:
        model = databaseOfMacs[modelCodeIsolatedFromSerial]
        listModels.iloc[count] = model
    except:
        listModels.iloc[count] = "Not found"

    count = count + 1
python excel python-3.x pandas
2个回答
0
投票

XlsxWriter docs,你需要打电话给df.to_excel(writer),然后是writer.save()

为了避免这个AttributeError,一个修复(也许不是最python-3-esque?)是将inputSerial = inputSerial.upper()更改为inputSerial = str(inputSerial).upper()


0
投票

有关解决该问题的代码,请参阅更新3

© www.soinside.com 2019 - 2024. All rights reserved.