【问题标题】:Merge and then sort columns of a dataframe based on the columns of the merging dataframe根据合并数据框的列合并然后对数据框的列进行排序
【发布时间】:2018-03-30 21:59:43
【问题描述】:

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

例如:

#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 来执行此操作吗?

编辑:也许更好的方式来表述排序过程是称它为 uncollat​​ed。每列放在一起的地方等等。

【问题讨论】:

  • 怕没有设置。根据什么标准进行排序?
  • 好吧,我希望排序标准是 column_names_1 中列名的顺序。
  • 那样的话,不是D先来吗?顺便说一句,为什么不直接按您想要的顺序索引列?
  • 好吧,当你合并两个数据框时,它会变成一个接一个。 (即['C_1','B_1','A','B_2','C_2','D'])。我想重新排列它,以便每列与其对应部分“配对”(即['C_1','C_2','B_1','B_2','A','D'])。从技术上讲,我可以为这个示例代码这样编码,但我希望它更加自动化。
  • 您对使用有序字典有何看法?

标签: python-3.x pandas sorting merge


【解决方案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]

【讨论】:

  • 不错的一个!这非常适合这个。不过现在只想到其他情况。如果使用 concat 而不是合并,这将如何实现? concat 将立即重新排序列。因此,这必须通过每个数据帧中的列列表来完成。
  • @MooseDrool concat 首先想到了。不幸的是,您不能在concat 中指定后缀,因此您必须在连接之前调用.add_suffix。这也意味着AD 将收到后缀,除非你能以某种方式控制它。顺便说一句,你会沿着第一个轴连接。
  • 哦,是的。在 A 和 D 中添加一个 sufficient 不会伤害它。
猜你喜欢
  • 1970-01-01
  • 2019-01-23
  • 2021-10-17
  • 2022-07-19
  • 2019-02-28
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多