我有两个数据帧,都用时间戳索引。我想保留合并的第一个数据框中列的顺序。
例如:
#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来执行此操作吗?
编辑:也许更好的方法来表达排序过程就是将其称为未分类。每列放在一起的情况等等。
答案 0 :(得分:1)
使用OrderedDict
,suggested。
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]