如何为某些列添加没有值的行

2024-09-27 23:17:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3.6.4和pandas0.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]]))

现在如何添加r2018,只有5月份的数据?你知道吗


Tags: columns代码文档dataframepandasdfindex例子
2条回答

我同意RafaelC的观点,用NaN填充2018年的数据是最好的方法。您可以使用Numpy中的np.nan(自从有了Pandas之后,您就已经安装了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.数据帧. 这样就不需要将每一行附加到前一行。你知道吗

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]]. 你知道吗

至于用NaN填充你的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)将数据帧中的值的数据类型转换为float。我这样做是为了使所有列都具有相同的数据类型。如果我们不调用.astype(float),那么Jan-May将是数据类型int,Jun-Dec将是数据类型float64。你知道吗

可以通过序列使用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.DataFrame.loc是便宜的。你知道吗

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

相关问题 更多 >

    热门问题