【问题标题】:AttributeError: 'Pandas' object has no attribute 'DataFrame'AttributeError:“Pandas”对象没有属性“DataFrame”
【发布时间】:2017-02-12 14:01:03
【问题描述】:

我正在尝试在 itertuples() 循环中使用 pandas.DataFrame 中的 to_csv 方法将切片的每一行从数据框对象写入新的 csv。但是,每当我在行对象上调用 DataFrame 时,都会出现以下错误。

AttributeError: 'Pandas' 对象没有属性 'DataFrame'

关于同一错误的其他问题表明这是为了:

1) DataFrame 大写错误,即 dataframe 或 Dataframe 2)或者pandas本身有问题,安装时出错等。

我知道它不是 1) 因为我已经编写了 DataFrame,如错误消息中所示。此外,我不希望它是 2) 因为我可以运行 pandas.read_csv 来导入数据帧,然后在这些对象上运行方法而没有任何问题。

所以,我的问题是:

1) 问题是否存在另一个可能的来源,可能是由于尝试将方法应用于循环中的一行?

2) 如何验证 pandas 及其所有方法都已正确安装?这样我就可以消除 2) 作为一种可能性。

for row in df.itertuples():
        if not os.path.isfile(path):
           row.DataFrame.to_csv(path, index=False, mode='w', header=headers)
        elif os.path.isfile(path):
           row.DataFrame.to_csv(path, index=False, mode='a')

AttributeError                            Traceback (most recent call last)
<ipython-input-192-0af973f1c147> in <module>()
     39                         row.DataFrame.to_csv(path, index=False, mode='w
, header=headers)
     40                 elif os.path.isfile(path):
---> 41                         row.DataFrame.to_csv(path, index=False, mode='a
)

AttributeError: 'Pandas' object has no attribute 'DataFrame'

我已尝试消除 itertuples() 循环并替换为应用于数据帧的函数。功能是:

df.apply(lambda x: df.loc[x].to_csv(''.join([dir,'-'.join([df.iloc[x][3],df.iloc[x][5],df.iloc[x][4],df.iloc[x][0]]),'.csv'])

嵌套连接方法由每行中的值组成路径。我已经对不同的行进行了测试,它工作正常,但现在我在函数行中收到以下错误:

type error: ('unorderable types: str() >= int()', 'occurred at index 0') 

这是什么意思?它想点什么?为什么?

【问题讨论】:

  • IIUC 你尝试删除DataFrame - row.to_csv(path, index=False, mode='w', header=headers)
  • 你做错了。见df.itertuples
  • 首先你为什么要这样做?您所做的只是将整个 df 写入一个位置,为什么不直接执行 df.to_csv(path, index=False)
  • @jezrael 是的,我试过了,但是它告诉我熊猫没有 to_csv 属性*.com/questions/38566430/…
  • @EdChum 也许我是,但是我的意图是只写行。我想将每一行分别写入不同的 csv。代码没有显示,但是每行的路径变量都会改变

标签: python pandas dataframe attributeerror


【解决方案1】:

在尝试将 Outlook 邮件数据加载到数据框中时,我也有同样的经历。 在下面的代码中,如果输入数据丢失 /message.To in this example/,您可以找到一种简单的解决方法。

import win32com.client
import pandas as pd
outlook =win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(5)
messages = inbox.Items
message = messages.GetFirst()
df2 = pd.DataFrame([[' ',' ',' ']],columns=list('ABC'))
i=1
while message:
    try:
        df2.loc[i]=(message.Subject,message.SenderEmailAddress,message.To) 
        i=i+1
    except:
        print("Error!")
        df2.loc[i]=(message.Subject,message.SenderEmailAddress,"Üres")
        i=i+1
    message = messages.GetNext()

【讨论】: