将 DataFrame 列拆分为两个 + MultiIndex

Posted

技术标签:

【中文标题】将 DataFrame 列拆分为两个 + MultiIndex【英文标题】:Split DataFrame column into two + MultiIndex 【发布时间】:2019-04-05 20:23:02 【问题描述】:

我有 DataFrame 代表人们跨越国界

flows = DataFrame([[1,2],[3,4]], index=['Monday', 'Tuesday'], columns=['CZ>DE', 'HU>AT'])

         CZ>DE  HU>AT
Monday       1      2
Tuesday      3      4

我想将每一列分成两列,代表每个边界的国家/地区增量/减量。我当前的代码和期望的结果是这样的

country_from = lambda x: x[:2]
country_to = lambda x: x[3:]
flows_from = -1*flows.copy()
flows_from.columns = pd.MultiIndex.from_tuples([(border, country_from(border)) for border in flows.columns])
flows_to = flows.copy()
flows_to.columns = pd.MultiIndex.from_tuples([(border, country_to(border)) for border in flows.columns])
country_flows = pd.concat([flows_from, flows_to], axis=1)
country_flows = country_flows.groupby(level=[0,1], axis=1).sum()

           CZ>DE    HU>AT   
           CZ DE    AT HU
Monday     -1  1     2 -2
Tuesday    -3  3     4 -4 

这个解决方案相当冗长,我怀疑它可以做得更好。有人有想法吗?

【问题讨论】:

【参考方案1】:

您可以创建定义 MultiIndex 级别的元组:

tuples = [(i,k) for i, j in zip(flows.columns,[i.split('>') for i in flows.columns]) for k in j]

x = flows.values

然后:

data = np.multiply(np.tile([-1,1], x.shape), np.repeat(x, 2, axis=1))

pd.DataFrame(data=data, index=flows.index, columns=pd.MultiIndex.from_tuples(tuples))

产量:

        CZ>DE    HU>AT   
           CZ DE    HU AT
Monday     -1  1    -2  2
Tuesday    -3  3    -4  4

【讨论】:

【参考方案2】:

好的,在python/pandas: how to combine two dataframes into one with hierarchical column index? 受到启发后,我通过连接 DataFrames 字典解决了这个问题。拥有我原来的映射 lambda 函数

country_from = lambda x: x[:2]
country_to = lambda x: x[3:]

一行就可以得到结果

pd.concat(col:pd.DataFrame(country_from(col):-1*flows[col], country_to(col):flows[col]) for col in flows.columns, axis=1)

           CZ>DE    HU>AT   
           CZ DE    AT HU
Monday     -1  1     2 -2
Tuesday    -3  3     4 -4

【讨论】:

以上是关于将 DataFrame 列拆分为两个 + MultiIndex的主要内容,如果未能解决你的问题,请参考以下文章

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置参数n控制拆分的次数设置expand参数将拆分结果列表内容转化为多列dataframe并添加到原dataframe中

Pandas Dataframe:如何将一列拆分为多个单热编码列[重复]

pandas将dataframe中的内容为列表(list)的数据列裂变拆分为多个新的数据列实战:拆分为多个新的数据列(并指定新数据列的名称)数据列中的列表(不等长)拆分为多个新的数据列产生NaN

如何将包含日期时间的 DataFrame 列拆分为两列:一列包含日期,另一列包含一天中的时间?

Pandas使用str属性获取数据列的字符串方法类split函数基于指定分隔符拆分数据列的内容为列表设置参数n控制拆分的次数设置expand参数将拆分结果列表内容转化为多列dataframe

Spark DataFrame列的合并与拆分