根据合并数据帧的列合并然后对数据框的列进行排序

时间:2017-10-18 22:22:04

标签: python-3.x pandas sorting merge

我有两个数据帧,都用时间戳索引。我想保留合并的第一个数据框中列的顺序。

例如:

#required packages
import pandas as pd
import numpy as np

# defining stuff
num_periods_1 = 11
num_periods_2 = 4

# create sample time series
dates1 = pd.date_range('1/1/2000 00:00:00', periods=num_periods_1, freq='10min')
dates2 = pd.date_range('1/1/2000 01:30:00', periods=num_periods_2, freq='10min')

column_names_1 = ['C', 'B', 'A']
column_names_2 = ['B', 'C', 'D']

df1 = pd.DataFrame(np.random.randn(num_periods_1, len(column_names_1)), index=dates1, columns=column_names_1)
df2 = pd.DataFrame(np.random.randn(num_periods_2, len(column_names_2)), index=dates2, columns=column_names_2)

df3 = df1.merge(df2, how='outer', left_index=True, right_index=True, suffixes=['_1', '_2'])
print("\nData Frame Three:\n", df3)

上面的代码生成两个数据帧,第一个是列C,B和A.第二个数据帧有列B,C和D.当前输出的列按以下顺序排列; C_1,B_1,A,B_2,C_2,D。我希望合并输出中的列为C_1,C_2,B_1,B_2,A_1,D_2。从第一个数据帧保留列的顺序,并且在相应数据旁边添加与第二个数据帧类似的任何数据。

合并中是否有设置或者我可以使用sort_index来执行此操作吗?

编辑:也许更好的方法来表达排序过程就是将其称为未分类。每列放在一起的情况等等。

1 个答案:

答案 0 :(得分:1)

使用OrderedDictsuggested

from collections import OrderedDict
from itertools import chain

c = df3.columns.tolist()
o = OrderedDict()

for x in c:
    o.setdefault(x.split('_')[0], []).append(x)

c = list(chain.from_iterable(o.values()))
df3 = df3[c]

一种替代方法,包括提取前缀,然后在索引上调用sorted

# https://stackoverflow.com/a/46839182/4909087
p = [s[0] for s in c]
c = sorted(c, key=lambda x: (p.index(x[0]), x))
df = df[c]