【问题标题】:Reading and writing column data in Python with Pandas使用 Pandas 在 Python 中读取和写入列数据
【发布时间】:2018-03-01 14:08:23
【问题描述】:

这项努力是美妙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

这一切都基于将其数据提供给 python 搁置的 excel 文件。这是它如何读取的一个小示例...我在主代码中将其称为“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

更新

到目前为止,我所拥有的 cmets 确实很有帮助。我认为我陷入困境的部分是将“for”循环的输出,在这种情况下为“模型”,进入“模型”列。变量 '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


    【解决方案1】:

    XlsxWriter docs,您需要拨打df.to_excel(writer),然后拨打writer.save()

    为避免出现 AttributeError,一种解决方法(可能不是最像 python-3 的?)是将 inputSerial = inputSerial.upper() 更改为 inputSerial = str(inputSerial).upper()

    【讨论】:

    • 属性错误问题现已修复,超级。我不确定在哪里或如何实现前两行代码。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-08-04
      • 2017-11-26
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      相关资源
      最近更新 更多