使用日期索引将新数据插入数据框
Inserting new data to dataframe with Date index
我有一个如下所示的 DF,其中日期值作为索引
我在一个数组中有 6 个值,我又向同一个数组添加了 6 个值,例如:
现在我需要将全部 12 个值附加到具有新日期索引值的同一个数组,如下所示:
当我尝试使用 test['value'] = new_values 设置值时,出现以下错误:
ValueError:值的长度 (18) 与索引的长度 (12) 不匹配
请帮忙
从你的问题中不清楚你是如何得到你提到的错误的,因为你没有展示你是如何创建 DataFrame 和数组的。
通过简单地重新分配单个列来调整 DF 的大小是不常见的,如果您考虑其他列在那种情况下应该如何表现,如果 DF 具有这些列,这对您来说应该很自然。相反,要调整 DF 的大小,我们通常使用专门函数之一 pd.concat
、pd.DataFrame.merge
或 pd.DataFrame.join
.
我会使用 pd.concat
来处理这种情况;更具体地说,使用 仅使用新值和索引 创建一个新的 DataFrame,并将其与旧值连接起来。
重现场景
这是尝试重新创建与您的起点类似的东西;即初始DF.
import numpy as np
import pandas as pd
init_index = np.arange(
np.datetime64("2021-07"),
np.datetime64("2022"),
np.timedelta64(1, "M")
)
init_values = np.random.rand(6, 1)
init_df = pd.DataFrame(
data=values,
index=index,
columns=["values"]
)
# >>> init_df
# values
# 2021-07-01 0.002215
# 2021-08-01 0.064340
# 2021-09-01 0.595143
# 2021-10-01 0.822837
# 2021-11-01 0.568886
# 2021-12-01 0.382716
这是重新创建 new_values
数组的相同尝试。我假设,根据您包含的图像,它不是一个简单的值列表,而是一个值列表列表,每个值列表包含一个值(即形状为 (6, 1)
的二维数组)。
new_values = np.concatenate((init_df["values"], np.random.rand(6,1)))
# >>> all_values
# array([[0.00221483],
# [0.0643404 ],
# [0.59514306],
# [0.82283698],
# [0.56888584],
# [0.38271593],
# [0.23964758],
# [0.90354089],
# [0.12688775],
# [0.53930331],
# [0.99087057],
# [0.12583731]])
希望这与您正在使用的内容足够接近。
实际解决方案
对于我的方法,我们创建一个仅包含新数据和新日期的新 DF:
all_values = new_values
new_values = all_values[7:]
new_index = np.arange(
np.datetime64("2021"),
np.datetime64("2021-07"),
np.timedelta64(1, "M")
)
new_df = pd.DataFrame(
data=new_values,
index=new_index,
columns=["values"]
)
# >>> new_df
# values
# 2021-01-01 0.239648
# 2021-02-01 0.903541
# 2021-03-01 0.126888
# 2021-04-01 0.539303
# 2021-05-01 0.990871
# 2021-06-01 0.125837
然后使用 pd.concat
:
连接两个 DF
final_df = pd.concat([init_df, new_df])
# >>> final_df
# values
# 2021-07-01 0.002215
# 2021-08-01 0.064340
# 2021-09-01 0.595143
# 2021-10-01 0.822837
# 2021-11-01 0.568886
# 2021-12-01 0.382716
# 2021-01-01 0.239648
# 2021-02-01 0.903541
# 2021-03-01 0.126888
# 2021-04-01 0.539303
# 2021-05-01 0.990871
# 2021-06-01 0.125837
我有一个如下所示的 DF,其中日期值作为索引
我在一个数组中有 6 个值,我又向同一个数组添加了 6 个值,例如:
现在我需要将全部 12 个值附加到具有新日期索引值的同一个数组,如下所示:
当我尝试使用 test['value'] = new_values 设置值时,出现以下错误:
ValueError:值的长度 (18) 与索引的长度 (12) 不匹配
请帮忙
从你的问题中不清楚你是如何得到你提到的错误的,因为你没有展示你是如何创建 DataFrame 和数组的。
通过简单地重新分配单个列来调整 DF 的大小是不常见的,如果您考虑其他列在那种情况下应该如何表现,如果 DF 具有这些列,这对您来说应该很自然。相反,要调整 DF 的大小,我们通常使用专门函数之一 pd.concat
、pd.DataFrame.merge
或 pd.DataFrame.join
.
我会使用 pd.concat
来处理这种情况;更具体地说,使用 仅使用新值和索引 创建一个新的 DataFrame,并将其与旧值连接起来。
重现场景
这是尝试重新创建与您的起点类似的东西;即初始DF.
import numpy as np
import pandas as pd
init_index = np.arange(
np.datetime64("2021-07"),
np.datetime64("2022"),
np.timedelta64(1, "M")
)
init_values = np.random.rand(6, 1)
init_df = pd.DataFrame(
data=values,
index=index,
columns=["values"]
)
# >>> init_df
# values
# 2021-07-01 0.002215
# 2021-08-01 0.064340
# 2021-09-01 0.595143
# 2021-10-01 0.822837
# 2021-11-01 0.568886
# 2021-12-01 0.382716
这是重新创建 new_values
数组的相同尝试。我假设,根据您包含的图像,它不是一个简单的值列表,而是一个值列表列表,每个值列表包含一个值(即形状为 (6, 1)
的二维数组)。
new_values = np.concatenate((init_df["values"], np.random.rand(6,1)))
# >>> all_values
# array([[0.00221483],
# [0.0643404 ],
# [0.59514306],
# [0.82283698],
# [0.56888584],
# [0.38271593],
# [0.23964758],
# [0.90354089],
# [0.12688775],
# [0.53930331],
# [0.99087057],
# [0.12583731]])
希望这与您正在使用的内容足够接近。
实际解决方案
对于我的方法,我们创建一个仅包含新数据和新日期的新 DF:
all_values = new_values
new_values = all_values[7:]
new_index = np.arange(
np.datetime64("2021"),
np.datetime64("2021-07"),
np.timedelta64(1, "M")
)
new_df = pd.DataFrame(
data=new_values,
index=new_index,
columns=["values"]
)
# >>> new_df
# values
# 2021-01-01 0.239648
# 2021-02-01 0.903541
# 2021-03-01 0.126888
# 2021-04-01 0.539303
# 2021-05-01 0.990871
# 2021-06-01 0.125837
然后使用 pd.concat
:
final_df = pd.concat([init_df, new_df])
# >>> final_df
# values
# 2021-07-01 0.002215
# 2021-08-01 0.064340
# 2021-09-01 0.595143
# 2021-10-01 0.822837
# 2021-11-01 0.568886
# 2021-12-01 0.382716
# 2021-01-01 0.239648
# 2021-02-01 0.903541
# 2021-03-01 0.126888
# 2021-04-01 0.539303
# 2021-05-01 0.990871
# 2021-06-01 0.125837