代码之家  ›  专栏  ›  技术社区  ›  Subhajit Kundu

如何为某些列添加不带值的行

  •  1
  • Subhajit Kundu  · 技术社区  · 6 年前

    我使用的是python 3.6.4和pandas 0.23.0。我已经参考了PANDAS 0.23.0文档以供构造器和附加。它没有提到任何不存在的值。我没有找到类似的例子。

    考虑以下代码:

    import pandas as pd
    
    months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
              "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
    
    index_yrs = [2016, 2017, 2018]
    
    r2016 = [26, 27, 25, 22, 20, 23, 22, 20, 20, 18, 18, 19]
    r2017 = [20, 21, 18, 16, 15, 15, 15, 15, 13, 13, 14, 15]
    r2018 = [16,  18,  18,  18,  17]
    
    df = pd.DataFrame([r2016], columns = months, index = [index_yrs[0]])
    df = df.append(pd.DataFrame([r2017], columns = months, index = [index_yrs[1]]))
    

    现在如何添加到5月份才有数据的R2018?

    2 回复  |  直到 6 年前
        1
  •  0
  •   jpp    6 年前

    可以使用添加行 pd.DataFrame.loc 通过一系列。所以只需要将数组转换为 pd.Series 添加行前的对象:

    df.loc[index_yrs[2]] = pd.Series(r2018, index=df.columns[:len(r2018)])
    
    print(df)
    
           Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
    2016  26.0  27.0  25.0  22.0  20.0  23.0  22.0  20.0  20.0  18.0  18.0  19.0
    2017  20.0  21.0  18.0  16.0  15.0  15.0  15.0  15.0  13.0  13.0  14.0  15.0
    2018  16.0  18.0  18.0  18.0  17.0   NaN   NaN   NaN   NaN   NaN   NaN   NaN
    

    但是,我强烈建议您在单个附加前形成一个列表列表(带填充)。这是因为 list.append 或者通过列表理解进行构造,相对于重复的来说是便宜的 pd.DataFrame.append pd.数据帧.loc .

    如果必须一次添加一行,建议使用上述解决方案。

        2
  •  4
  •   L.P. Whigley    6 年前

    我同意Rafaelc的观点,在2018年的数据列表中用NaN填充缺失值是最好的方法。你可以用 np.nan 从numpy(你有熊猫后就已经安装了)生成nan。

    import pandas as pd
    import numpy as np
    
    months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
              "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
    
    index_yrs = [2016, 2017, 2018]
    

    作为代码的一个小改动,我把三年来的数据 years 列出我们可以作为 data pd.dataframe的参数。这样就不需要将每一行附加到前一行。

    r2016 = [26, 27, 25, 22, 20, 23, 22, 20, 20, 18, 18, 19]
    r2017 = [20, 21, 18, 16, 15, 15, 15, 15, 13, 13, 14, 15]
    r2018 = [16,  18,  18,  18,  17]
    years = [r2016] + [r2017] + [r2018]  
    

    这就是年份的样子:【26、27、25、22、20、23、22、20、20、18、18、19】, [20、21、18、16、15、15、15、15、13、13、14、15], 【16、18、18、18、17】】。

    至于给你的2018年加上像这样的“奶奶”,可能会起到作用。我们只是确保,如果一年只有前n个月的价值,那么剩余的月份将由nan填写。

    for year in years:
        if len(year) < 12:
            year.extend([np.nan] * (12 - len(year)))
    

    最后,我们可以使用下面的一行程序来创建您的数据框架,而不是一行一行地追加数据。

    df = pd.DataFrame(years, columns=months, index=index_yrs).astype(float)
    

    输出:

          Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
    2016  26.0  27.0  25.0  22.0  20.0  23.0  22.0  20.0  20.0  18.0  18.0  19.0
    2017  20.0  21.0  18.0  16.0  15.0  15.0  15.0  15.0  13.0  13.0  14.0  15.0
    2018  16.0  18.0  18.0  18.0  17.0  NaN   NaN   NaN   NaN   NaN   NaN   NaN
    

    您可能会注意到,我使用 .astype(float) . 我这样做是为了使您的所有列都成为同一个数据类型。如果我们不打电话 .astype(浮点) 那么jan may将是dtype int 6月-12月为数据类型 float64 .