- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想修改一个 pandas MultiIndex DataFrame,使每个索引组都包含指定范围之间的日期。我希望每个组用值 0(或 NaN
)填写缺失的日期 2013-06-11 到 2013-12-31。
Group A, Group B, Date, Value
loc_a group_a 2013-06-11 22
2013-07-02 35
2013-07-09 14
2013-07-30 9
2013-08-06 4
2013-09-03 40
2013-10-01 18
group_b 2013-07-09 4
2013-08-06 2
2013-09-03 5
group_c 2013-07-09 1
2013-09-03 2
loc_b group_a 2013-10-01 3
我看过一些关于 reindex
ing 的讨论,但那是针对简单(非分组)时间序列数据的。
有没有简单的方法可以做到这一点?
以下是我为实现这一目标所做的一些尝试。例如:一旦我通过 ['A', 'B']
取消堆叠,我就可以重新索引。
df = pd.DataFrame({'A': ['loc_a'] * 12 + ['loc_b'],
'B': ['group_a'] * 7 + ['group_b'] * 3 + ['group_c'] * 2 + ['group_a'],
'Date': ["2013-06-11",
"2013-07-02",
"2013-07-09",
"2013-07-30",
"2013-08-06",
"2013-09-03",
"2013-10-01",
"2013-07-09",
"2013-08-06",
"2013-09-03",
"2013-07-09",
"2013-09-03",
"2013-10-01"],
'Value': [22, 35, 14, 9, 4, 40, 18, 4, 2, 5, 1, 2, 3]})
df.Date = df['Date'].apply(lambda x: pd.to_datetime(x).date())
df = df.set_index(['A', 'B', 'Date'])
dt_start = dt.datetime(2013,6,1)
all_dates = [(dt_start + dt.timedelta(days=x)).date() for x in range(0,60)]
df2 = df.unstack(['A', 'B'])
df3 = df2.reindex(index=all_dates).fillna(0)
df4 = df3.stack(['A', 'B'])
## df4 is about where I want to get, now I'm trying to get it back in the form of df...
df5 = df4.reset_index()
df6 = df5.rename(columns={'level_0' : 'Date'})
df7 = df6.groupby(['A', 'B', 'Date'])['Value'].sum()
最后几行让我有点难过。我希望在 df6
我可以简单地 set_index
回到 ['A', 'B', 'Date']
,但确实如此不要将值分组,因为它们在初始 df
DataFrame 中分组。
关于如何重新索引未堆叠的 DataFrame、重新堆叠并使 DataFrame 的格式与原始格式相同有什么想法吗?
最佳答案
您可以根据现有多索引的级别的笛卡尔积制作新的多索引。然后,使用新索引重新索引您的数据框。
new_index = pd.MultiIndex.from_product(df.index.levels)
new_df = df.reindex(new_index)
# Optional: convert missing values to zero, and convert the data back
# to integers. See explanation below.
new_df = new_df.fillna(0).astype(int)
就是这样!新数据框具有所有可能的索引值。现有数据已正确编入索引。
继续阅读以获得更详细的说明。
import pandas as pd
df = pd.DataFrame({'A': ['loc_a'] * 12 + ['loc_b'],
'B': ['group_a'] * 7 + ['group_b'] * 3 + ['group_c'] * 2 + ['group_a'],
'Date': ["2013-06-11",
"2013-07-02",
"2013-07-09",
"2013-07-30",
"2013-08-06",
"2013-09-03",
"2013-10-01",
"2013-07-09",
"2013-08-06",
"2013-09-03",
"2013-07-09",
"2013-09-03",
"2013-10-01"],
'Value': [22, 35, 14, 9, 4, 40, 18, 4, 2, 5, 1, 2, 3]})
df.Date = pd.to_datetime(df.Date)
df = df.set_index(['A', 'B', 'Date'])
示例数据如下所示
Value
A B Date
loc_a group_a 2013-06-11 22
2013-07-02 35
2013-07-09 14
2013-07-30 9
2013-08-06 4
2013-09-03 40
2013-10-01 18
group_b 2013-07-09 4
2013-08-06 2
2013-09-03 5
group_c 2013-07-09 1
2013-09-03 2
loc_b group_a 2013-10-01 3
使用 from_product我们可以创建一个新的多索引。这个新索引是Cartesian product旧索引所有级别的所有值。
new_index = pd.MultiIndex.from_product(df.index.levels)
使用新索引重新索引现有数据框。
new_df = df.reindex(new_index)
现在所有可能的组合都出现了。缺失值为空 (NaN)。
扩展后的重新索引数据框如下所示:
Value
loc_a group_a 2013-06-11 22.0
2013-07-02 35.0
2013-07-09 14.0
2013-07-30 9.0
2013-08-06 4.0
2013-09-03 40.0
2013-10-01 18.0
group_b 2013-06-11 NaN
2013-07-02 NaN
2013-07-09 4.0
2013-07-30 NaN
2013-08-06 2.0
2013-09-03 5.0
2013-10-01 NaN
group_c 2013-06-11 NaN
2013-07-02 NaN
2013-07-09 1.0
2013-07-30 NaN
2013-08-06 NaN
2013-09-03 2.0
2013-10-01 NaN
loc_b group_a 2013-06-11 NaN
2013-07-02 NaN
2013-07-09 NaN
2013-07-30 NaN
2013-08-06 NaN
2013-09-03 NaN
2013-10-01 3.0
group_b 2013-06-11 NaN
2013-07-02 NaN
2013-07-09 NaN
2013-07-30 NaN
2013-08-06 NaN
2013-09-03 NaN
2013-10-01 NaN
group_c 2013-06-11 NaN
2013-07-02 NaN
2013-07-09 NaN
2013-07-30 NaN
2013-08-06 NaN
2013-09-03 NaN
2013-10-01 NaN
可以看到新数据框中的数据已经从整数转换为 float 了。 Pandas can't have nulls in an integer column .或者,我们可以将所有空值转换为 0,并将数据转换回整数。
new_df = new_df.fillna(0).astype(int)
结果
Value
loc_a group_a 2013-06-11 22
2013-07-02 35
2013-07-09 14
2013-07-30 9
2013-08-06 4
2013-09-03 40
2013-10-01 18
group_b 2013-06-11 0
2013-07-02 0
2013-07-09 4
2013-07-30 0
2013-08-06 2
2013-09-03 5
2013-10-01 0
group_c 2013-06-11 0
2013-07-02 0
2013-07-09 1
2013-07-30 0
2013-08-06 0
2013-09-03 2
2013-10-01 0
loc_b group_a 2013-06-11 0
2013-07-02 0
2013-07-09 0
2013-07-30 0
2013-08-06 0
2013-09-03 0
2013-10-01 3
group_b 2013-06-11 0
2013-07-02 0
2013-07-09 0
2013-07-30 0
2013-08-06 0
2013-09-03 0
2013-10-01 0
group_c 2013-06-11 0
2013-07-02 0
2013-07-09 0
2013-07-30 0
2013-08-06 0
2013-09-03 0
2013-10-01 0
关于python - 填补 MultiIndex Pandas Dataframe 中的日期空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17287933/
这个问题困扰了我一段时间,因为我一直在寻找一种有效的方法。基本上,我有一个数据框,每行都有一个来自实验的数据样本。我想这应该更多地被视为来自实验的日志文件,而不是用于分析的数据的最终版本。 我遇到的问
我有一个带有 IDENTITY 列的表 [Id] int IDENTITY(1, 1) NOT NULL 在添加/删除了一些行之后,我以 Id 值的差距结束: Id Name ---------
我有一个发票表,我在其中存储给定数据范围的发票(即 2012-01-01 到 2012-01-31 之间日期的发票 1)。现在有几天可能没有关联的发票,所以你会有 > ID | START_DATE
我正在查询 DATE 字段: SELECT DATE , FIELD2 , FIELD3 into Table_new FROM Table_old WHERE (crite
我有下表 data_users id | signed_up_at | product_id -------+---------------------------------
抱歉这个模糊的主题,但我想不出该放什么。 这是我的问题,我正在对一个表进行查询,该表返回与一天相关的项目计数。我想确保如果我对数据库进行查询,我总是会得到一定数量的行。例如,假设我有下表,其中包含人们
这个问题在这里已经有了答案: Why does CSS Grid layout add extra gaps between cells? (4 个答案) CSS-only masonry layo
给定数据框 df = pd.DataFrame(data=[[1,1,3],[1,2,6],[1,4,3],[2,2,6]],columns=['ID','Day','Value']) df Out[
我有以日期时间为索引的 Pandas DataFrame(从 .csv 加载).. 每天有/必须有一个条目。问题是我有差距,即有些日子我根本没有数据。在间隙中插入行(天)的最简单方法是什么?还有一种方
我只想用最简单的术语对 3D 数据集进行插值。线性插值,最近邻,这就足够了(这是开始一些算法,所以不需要准确估计)。 在新的 scipy 版本中,像 griddata 这样的东西会很有用,但目前我只有
我有一个类似于下面示例的多维数组,我想使用 Ruby 的 zip 方法将其组合在一起。当每个内部数组具有相同数量的元素时,我可以正常工作,但当它们的长度不同时,我会遇到问题。 在下面的示例中,第二组在
我有一个由日期和一些值组成的数组或对象: var flatData = [ { "date": "2012-05-26", "product": "apple" }, { "date
我有一个带有列 Age 的表格, Period和 Year .栏目Age总是从 0 开始并且没有固定的最大值(我在这个例子中使用了 'Age' 0 到 30,但范围也可以是 0 到 100 等),值
在 SQL Server 2014 中,我有一个如下所示的 Periods 表: | PeriodId | PeriodStart | PeriodEnd | -------------------
在 SQL Server 2014 中,我有一个如下所示的 Periods 表: | PeriodId | PeriodStart | PeriodEnd | -------------------
我正在尝试在 NVD3.js 中制作水平分组堆叠条形图。一切都很好,直到我的 JSON 数据出现“差距”,如下所示: [{ "key": "Education & news",
我想修改一个 pandas MultiIndex DataFrame,使每个索引组都包含指定范围之间的日期。我希望每个组用值 0(或 NaN)填写缺失的日期 2013-06-11 到 2013-12-
我是一名优秀的程序员,十分优秀!