【问题标题】:DataFrame object has no attribute 'name'DataFrame 对象没有属性“名称”
【发布时间】:2019-10-06 10:20:10
【问题描述】:

我目前有一个 Pandas DataFrames 列表。我正在尝试对每个列表元素(即列表中包含的每个 DataFrame)执行操作,然后将该 DataFrame 保存到 CSV 文件中。

我为每个 DataFrame 分配了一个name 属性,但我意识到在某些情况下程序会抛出错误AttributeError: 'DataFrame' object has no attribute 'name'

这是我的代码。

# raw_og contains the file names for each CSV file.
# df_og is the list containing the DataFrame of each file.
for idx, file in enumerate(raw_og):
    df_og.append(pd.read_csv(os.path.join(data_og_dir, 'raw', file)))
    df_og[idx].name = file

# I'm basically checking if the DataFrame is in reverse-chronological order using the
# check_reverse function. If it is then I simply reverse the order and save the file.
for df in df_og:
    if (check_reverse(df)):
        df = df[::-1]
        df.to_csv(os.path.join(data_og_dir, 'raw_new', df.name), index=False)
    else:
        continue

程序在我使用 df.name 的第二个 for 循环中抛出错误。

这特别奇怪,因为当我运行print(df.name) 时,它会打印出文件名。有人会碰巧知道我做错了什么吗?

谢谢。

【问题讨论】:

    标签: python pandas dataframe attributeerror


    【解决方案1】:

    解决方案是使用 loc 来设置值,而不是创建副本。

    创建 df 的副本会丢失名称:

    df = df[::-1] # creates a copy
    

    设置值“保持”原始对象的完整性以及名称

    df.loc[:] = df[:, ::-1] # reversal maintaining the original object
    

    沿列轴反转值的示例代码:

    df = pd.DataFrame([[6,10]], columns=['a','b'])
    df.name='t'
    print(df.name)
    print(df)
    df.iloc[:] = df.iloc[:,::-1]
    print(df)
    print(df.name)
    

    输出:

    t
       a   b
    0  6  10
        a  b
    0  10  6
    t
    

    【讨论】:

      【解决方案2】:

      解决方法是设置columns.name 并在需要时使用它。

      例子:

      df = pd.DataFrame()
      
      df.columns.name = 'name'
      
      print(df.columns.name)
      
      name
      

      【讨论】:

        【解决方案3】:

        怀疑是反转丢失了自定义 .name 属性。

        In [11]: df = pd.DataFrame()
        
        In [12]: df.name = 'empty'
        
        In [13]: df.name
        Out[13]: 'empty'
        
        In [14]: df[::-1].name
        AttributeError: 'DataFrame' object has no attribute 'name'
        

        最好存储数据帧的字典而不是使用 .name:

        df_og = {file: pd.read_csv(os.path.join(data_og_dir, 'raw', fn) for fn in raw_og}
        

        然后你可以遍历这个并反转需要反转的值......

        for fn, df in df_og.items():
            if (check_reverse(df)):
                df = df[::-1]
                df.to_csv(os.path.join(data_og_dir, 'raw_new', fn), index=False)
        

        【讨论】:

          猜你喜欢
          • 2022-01-17
          相关资源
          最近更新 更多