Pandas:将数据帧添加到数据帧 - 匹配索引和列值
Pandas: add dataframes to dataframe - match on index and column value
我正在尝试将 pandas 数据帧添加到另一个具有不同长度的数据帧,以便结果中的值与(时间)索引和所有列中存在的列的键值对齐数据框。
假设我想合并 df1、df2 和 df3 并在索引和列上合并 'id':
df1
id value1
2015-05-01 1 13
2015-05-01 2 14
2015-05-02 1 15
2015-05-02 2 16
df2
id value2
2015-05-01 1 4
2015-05-02 1 5
df3
id value2
2015-05-01 2 7
2015-05-02 2 8
我想要的是得到一个看起来像
的数据框
df
id value1 value2
2015-05-01 1 13 4
2015-05-01 2 14 7
2015-05-02 1 15 5
2015-05-02 2 16 8
但我对合并功能感到困惑。
如果你的 DataFrame 是这样的:
import datetime as DT
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'id':[1,2,1,2], 'value1':[13,14,15,16]}, index=pd.DatetimeIndex(['2015-5-1', '2015-5-1', '2015-5-2', '2015-5-2']))
df2 = pd.DataFrame({'id':[1,1], 'value2':[4,5]}, index=pd.DatetimeIndex(['2015-5-1', '2015-5-2']))
df3 = pd.DataFrame({'id':[2,2], 'value2':[7,8]}, index=pd.DatetimeIndex(['2015-5-1', '2015-5-2']))
您可以连接所有数据帧:
df = pd.concat([df1,df2,df3])
# id value1 value2
# 2015-05-01 1 13 NaN
# 2015-05-01 2 14 NaN
# 2015-05-02 1 15 NaN
# 2015-05-02 2 16 NaN
# 2015-05-01 1 NaN 4
# 2015-05-02 1 NaN 5
# 2015-05-01 2 NaN 7
# 2015-05-02 2 NaN 8
由于结果在日期和 id
上都是对齐的,因此将 id
设置为索引是很自然的。然后,如果我们堆叠 DataFrame,我们会得到这个系列:
series = df.set_index(['id'], append=True).stack()
# id
# 2015-05-01 1 value1 13
# 2 value1 14
# 2015-05-02 1 value1 15
# 2 value1 16
# 2015-05-01 1 value2 4
# 2015-05-02 1 value2 5
# 2015-05-01 2 value2 7
# 2015-05-02 2 value2 8
# dtype: float64
现在,如果我们翻转并拆开系列,值将根据剩余索引对齐——日期和 id
:
result = series.unstack()
产量
value1 value2
id
2015-05-01 1 13 4
2 14 7
2015-05-02 1 15 5
2 16 8
注意unstack()
要求剩下的索引是唯一的。这意味着
没有重复的 (date, id)
条目。如果有重复条目,则不清楚所需的输出应该是什么。解决该问题的一种方法是按 date
和 id
分组并聚合值。另一种选择是选择一个值并删除其他值。
我正在尝试将 pandas 数据帧添加到另一个具有不同长度的数据帧,以便结果中的值与(时间)索引和所有列中存在的列的键值对齐数据框。
假设我想合并 df1、df2 和 df3 并在索引和列上合并 'id':
df1
id value1
2015-05-01 1 13
2015-05-01 2 14
2015-05-02 1 15
2015-05-02 2 16
df2
id value2
2015-05-01 1 4
2015-05-02 1 5
df3
id value2
2015-05-01 2 7
2015-05-02 2 8
我想要的是得到一个看起来像
的数据框df
id value1 value2
2015-05-01 1 13 4
2015-05-01 2 14 7
2015-05-02 1 15 5
2015-05-02 2 16 8
但我对合并功能感到困惑。
如果你的 DataFrame 是这样的:
import datetime as DT
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'id':[1,2,1,2], 'value1':[13,14,15,16]}, index=pd.DatetimeIndex(['2015-5-1', '2015-5-1', '2015-5-2', '2015-5-2']))
df2 = pd.DataFrame({'id':[1,1], 'value2':[4,5]}, index=pd.DatetimeIndex(['2015-5-1', '2015-5-2']))
df3 = pd.DataFrame({'id':[2,2], 'value2':[7,8]}, index=pd.DatetimeIndex(['2015-5-1', '2015-5-2']))
您可以连接所有数据帧:
df = pd.concat([df1,df2,df3])
# id value1 value2
# 2015-05-01 1 13 NaN
# 2015-05-01 2 14 NaN
# 2015-05-02 1 15 NaN
# 2015-05-02 2 16 NaN
# 2015-05-01 1 NaN 4
# 2015-05-02 1 NaN 5
# 2015-05-01 2 NaN 7
# 2015-05-02 2 NaN 8
由于结果在日期和 id
上都是对齐的,因此将 id
设置为索引是很自然的。然后,如果我们堆叠 DataFrame,我们会得到这个系列:
series = df.set_index(['id'], append=True).stack()
# id
# 2015-05-01 1 value1 13
# 2 value1 14
# 2015-05-02 1 value1 15
# 2 value1 16
# 2015-05-01 1 value2 4
# 2015-05-02 1 value2 5
# 2015-05-01 2 value2 7
# 2015-05-02 2 value2 8
# dtype: float64
现在,如果我们翻转并拆开系列,值将根据剩余索引对齐——日期和 id
:
result = series.unstack()
产量
value1 value2
id
2015-05-01 1 13 4
2 14 7
2015-05-02 1 15 5
2 16 8
注意unstack()
要求剩下的索引是唯一的。这意味着
没有重复的 (date, id)
条目。如果有重复条目,则不清楚所需的输出应该是什么。解决该问题的一种方法是按 date
和 id
分组并聚合值。另一种选择是选择一个值并删除其他值。