【问题标题】:Appending rows to empty DataFrame not working将行附加到空 DataFrame 不起作用
【发布时间】:2018-05-19 22:06:32
【问题描述】:

我有一段 Python 代码基本上可以简化为以下内容:

import pandas as pd

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
l = [1607.8, 1688.17, 1605.66, 1469.03, 1312.65, 1451.74, 1445.26, 1350.94, 1371.27, 1201.6, 1240.59, 1291.43]

# First, construct a empty DataFrame.
df = pd.DataFrame(columns = months, dtype=float)

# Then, keep adding rows to DataFrame given by list l.
df.append([l])

print df

预期输出是:

      Jan      Feb      Mar      Apr      May      Jun      Jul      Aug  \
0  1607.8  1688.17  1605.66  1469.03  1312.65  1451.74  1445.26  1350.94   

       Sep     Oct      Nov      Dec  
0  1371.27  1201.6  1240.59  1291.43  

但是我得到的是以下内容:

Empty DataFrame
Columns: [Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
Index: []

如果我将df.append([l]) 替换为以下内容,我的工作正常。

df = pd.DataFrame([l], columns = months)
df.columns = months

我做错了什么?

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    您应该使用pd.DataFrame.loc 在给定列表l 的情况下添加一行:

    df.loc[len(df.index)+1] = l
    

    pd.DataFrame.append 方法用于将一个数据帧或其他可附加对象附加到现有数据帧:

    DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=None)

    将其他行追加到该帧的末尾


    但是,形成一个列表列表然后只调用一次pd.DataFrame.append 会更有效。

    list_of_lists = []
    
    for item in some_iterable:
        l = foo(item)
        list_of_lists.append(l)
    
    df = df.append(pd.DataFrame(list_of_lists, columns=df.columns))
    

    这样做的原因是list.appendpd.DataFrame.loc 分配便宜。

    【讨论】:

    • 正是我所需要的,谢谢(第二种方法,单个 df.append)!
    【解决方案2】:

    pd.append() 没有发生。您需要保存输出才能使用它。

    【讨论】:

    • 这是我最初的错误导致我来到这里 :)
    【解决方案3】:

    最简单的方法:

       df= pd.DataFrame(l).T
       df.columns=months
    

    【讨论】:

      【解决方案4】:

      对于已经存在l 的数据来构建数据框,这可能是最好的:

      pd.DataFrame([l], columns=months)
      

      要通过append 方法将一行附加到现有数据帧,此方法有效:

      df.append(pd.DataFrame([l], columns=months))
      

      对于一般追加一行,jpp 提出的建议可能是最好的。

      【讨论】:

        【解决方案5】:

        如果列的顺序无关紧要,您可以使用这一行:

        df = pd.DataFrame(dict(zip(months,l)),index=[0])
        

        输出:

        Apr      Aug      Dec      Feb     Jan      Jul      Jun      Mar  \
        0  1469.03  1350.94  1291.43  1688.17  1607.8  1445.26  1451.74  1605.66   
        
               May      Nov     Oct      Sep  
        0  1312.65  1240.59  1201.6  1371.27
        

        如果您想按月份顺序对列进行排序,则只需在构建数据框后添加此行:

        df = df[months]
        

        输出:

        Jan      Feb      Mar      Apr      May      Jun      Jul      Aug  \
        0  1607.8  1688.17  1605.66  1469.03  1312.65  1451.74  1445.26  1350.94   
        
               Sep     Oct      Nov      Dec  
        0  1371.27  1201.6  1240.59  1291.43 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-17
          • 1970-01-01
          • 2013-08-14
          • 2018-09-02
          • 1970-01-01
          • 2014-05-19
          • 2019-03-22
          • 2018-07-15
          相关资源
          最近更新 更多