我使用的是 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?
最佳答案
我同意 RafaelC 的观点,即使用 NaN 填充缺失值的 2018 年数据列表是执行此操作的最佳方法。您可以使用 Numpy 中的 np.nan
(您已经安装了 Pandas)来生成 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
列表中,我们可以将其作为 pd.DataFrame 的 data
参数传递。这消除了将每一行附加到前面的行的需要。
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)
将数据框中值的 dtype 转换为 float。我这样做是为了使您的所有列都具有相同的数据类型。如果我们不调用 .astype(float)
,那么 Jan-May 将是 dtype int
,而 Jun-Dec 将是 dtype float64
。
关于python - 如何为某些列添加没有值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50546740/