将 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