python - 如何在熊猫中将一段时间内具有不同(但有时重叠)索引的数据帧组合在一起?
问题描述
这是我的另一个 StackOverflow 帖子的延续。假设我有一些随机顺序进入的数据帧(下面,我将模拟这些数据帧)。
# assume that df1, df2, df3 and df4 will come in any order
df1 = pd.DataFrame({'2016-01': ['A1', 'A2', 'A3', 'A4'],
'2016-02': ['B1', 'B2', 'B3', 'B4'],
'2016-03': ['C1', 'C2', 'C3', 'C4'],
'2016-04': ['D1', 'D2', 'D3', 'D4']},
index=['N1', 'N2', 'N3', 'N4'])
df2 = pd.DataFrame({'2017-01': ['A1', 'A2', 'A3', 'A5'],
'2017-02': ['B1', 'B2', 'B3', 'B5'],
'2017-03': ['C1', 'C2', 'C3', 'C5'],
'2017-04': ['D1', 'D2', 'D3', 'D5']},
index=['N1', 'N2', 'N3', 'N5'])
df3 = pd.DataFrame({'2016-01': ['A6', 'A7', 'A8', 'A9'],
'2016-02': ['B6', 'B7', 'B8', 'B9'],
'2016-03': ['C6', 'C7', 'C8', 'C9'],
'2016-04': ['D6', 'D7', 'D8', 'D9']},
index=['N6', 'N7', 'N8', 'N9'])
df4 = pd.DataFrame({'2017-01': ['A6', 'A7', 'A9', 'A10'],
'2017-02': ['B6', 'B7', 'B9', 'B10'],
'2017-03': ['C6', 'C7', 'C9', 'C10'],
'2017-04': ['D6', 'D7', 'D9', 'D10']},
index=['N6', 'N7', 'N9', 'N10'])
# this is the final data frame I'd like to build out of df1, df2, df3 and df4
desired_final_df = pd.DataFrame({
'2016-01': ['A1', 'A2', 'A3', 'A4', '', 'A6', 'A7', 'A8', 'A9', ''],
'2016-02': ['B1', 'B2', 'B3', 'B4', '', 'B6', 'B7', 'B8', 'B9', ''],
'2016-03': ['C1', 'C2', 'C3', 'C4', '', 'C6', 'C7', 'C8', 'C9', ''],
'2016-04': ['D1', 'D2', 'D3', 'D4', '', 'D6', 'D7', 'D8', 'D9', ''],
'2017-01': ['A1', 'A2', 'A3', '', 'A5', 'A6', 'A7', '', 'A9', 'A10'],
'2017-02': ['B1', 'B2', 'B3', '', 'B5', 'B6', 'B7', '', 'B9', 'B10'],
'2017-03': ['C1', 'C2', 'C3', '', 'C5', 'C6', 'C7', '', 'C9', 'C10'],
'2017-04': ['D1', 'D2', 'D3', '', 'D5', 'D6', 'D7', '', 'D9', 'D10']},
index=['N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'N7', 'N8', 'N9', 'N10'])
正如上面代码中所解释的,我想构建desired_final_df
,和. 我现在能做的最好的事情是这样的:df1
df2
df3
df4
df12 = pd.concat([df1,df2],axis=1, sort=True)
df34 = pd.concat([df3,df4],axis=1, sort=True)
desired_final_df = pd.concat([df12,df34],axis=0, sort=False)
但是这种方法需要我知道要附加哪个axis=1
与axis=0
. 有没有一种更像熊猫的方式从上面的小块中构建合并的数据框?我在想一些事情:
desired_final_df = pd.DataFrame() for f in data_files: # 我们可以替换 [df1, df2, df3, df4] 用于演示目的 cur_df = pd.read_excel(f, index_col=0) if any(set(cur_df.index) & set(final_df.index)): final_df = pd.concat([final_df, cur_df], axis=1, sort=False) else: final_df = final_df.append(cur_df)
显然,上面的代码正在生成desired_final_df
.
非常感谢任何提示/建议。谢谢!
解决方案
concat
+groupby
开axis=1
l=[df1,df2,df3,df4]
m=pd.concat(l,axis=1,sort=False)
m.groupby(m.columns,axis=1).first().fillna('') #ideally don't use the fillna
2016-01 2016-02 2016-03 2016-04 2017-01 2017-02 2017-03 2017-04
N1 A1 B1 C1 D1 A1 B1 C1 D1
N2 A2 B2 C2 D2 A2 B2 C2 D2
N3 A3 B3 C3 D3 A3 B3 C3 D3
N4 A4 B4 C4 D4
N5 A5 B5 C5 D5
N6 A6 B6 C6 D6 A6 B6 C6 D6
N7 A7 B7 C7 D7 A7 B7 C7 D7
N8 A8 B8 C8 D8
N9 A9 B9 C9 D9 A9 B9 C9 D9
N10 A10 B10 C10 D10
推荐阅读
- javascript - 删除在一个下拉列表字段中选择的选项,并且不显示在该行中存在的其他下拉列表中不起作用-jquery
- php - 填充 $_FILES 不返回文件扩展名
- vba - 在 VBA 中创建评估字符串
- r - ggplot 中使用 geom_line 的时间序列
- php - 如何将位图从android发送到php文件
- java - OkHttp 是否有类似于 Unirest 的用于创建 RequestBody 的字段方法的更简单的方法?
- c# - 如何在 C# JArray 中检查是否有特定的密钥对
- android - 在达到最大参与者后,使 IMS 电话会议中的合并选项不可见
- php - 为什么我不能将输入类型日期的最小值设置为今天?
- r - fread 和 zcat 问题