python - 如何在 pandas 中将一段时间内具有不同(但有时重叠)索引的数据帧组合起来?

标签 python pandas dataframe

这是我的 other StackOverflow post 的延续。假设我有一些以任意随机顺序进入的数据帧(下面,我将模拟这些数据帧)。

# 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'])

如上面代码中所述,我想使用 df1df2df3 构建 desired_final_dfdf4。我现在能做的最好的事情是这样的:

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=1axis=0 附加哪一个。 是否有一种更像 pandas 的方法,可以像上面那样用较小的 block 构建整合的数据框架?我正在考虑以下内容:

desired_final_df = pd.DataFrame() for f in data_files: # 我们可以替换 [df1, df2, df3, df4] 以进行演示 cur_df = pd.read_excel(f,index_col=0) 如果有(设置(cur_df.index)&设置(final_df.index)): Final_df = pd.concat([final_df, cur_df], axis=1, sort=False) 别的: Final_df = Final_df.append(cur_df)

显然,上面的代码正在生成 desired_final_df

非常感谢任何提示/建议。谢谢!

enter image description here

最佳答案

concat + groupby on 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

关于python - 如何在 pandas 中将一段时间内具有不同(但有时重叠)索引的数据帧组合起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57927746/

相关文章:

python - 在 Python 中创建类的 'grid' 实例

python - 如何将 Tweepy OAuth 用于 Twitter 的新 API?

python - 如何将默认值从数据库传递到 wagtail 中的 map 字段面板

python - 如何使用 for 循环以 pandas 数据框中现有列为条件创建新列

python-2.7 - 以文件名作为列标题将多个 *.txt 文件读入 Pandas Dataframe

r - 转换为正确的格式并对数据框中的项目进行计数

python - 删除 None 值的管道

python - 使用 Pandas 从文本文件中提取标题数据

python - 无法绘制饼图的值计数

python Pandas : select a range of index