首页 > 解决方案 > 将 2 级数据重构为 3 级数据

问题描述

我有一个两级多级数据。下面是一个例子。我有两个参与者报告了他们两天的水果消费情况。

id day apple orange
1   1    34     12
1   2    54     43
2   1    65     56
2   2    87     81

我想将数据框从 2 级数据重组为 3 级数据。我想 a) 为水果类型创建一个变量;b) 在一列中以天为单位的巢果消费量。所以数据框如下所示:

id day fruit_type fruit_consumption
1   1      apple                34
1   1     orange                12
1   2      apple                54
1   2     orange                43
2   1      apple                65
2   1     orange                56
2   2      apple                87
2   2     orange                81

标签: rdataframedata-manipulationmulti-levelmultilevel-analysis

解决方案


如果您指的是 Python,pandas DataFrame那么我已经为它编写了下一个解决方案,有点通用,不仅适用于需要重新排列的两列 apple/orange,而且适用于任意数量的列,通过crng在开头指定范围来控制脚本。应该可以快速工作,因为它使用简单numpy的少量 python 循环迭代。

您也可以在这里在线尝试下一个代码!.

import pandas as pd, numpy as np

crng = (2, 4) # Range of columns for rearranging

df = pd.DataFrame([map(int, line.split()) for line in """
    1   1    34     12
    1   2    54     43
    2   1    65     56
    2   2    87     81
""".splitlines() if line.strip()], columns = ['id', 'day', 'apple', 'orange'])
print('input:\n', df)

a = df.values
b = np.zeros((a.shape[0], crng[1] - crng[0], crng[0] + 2), dtype = np.object_)

for icol, col in enumerate(df.columns[crng[0] : crng[1]]):
    b[:, icol, 0] = a[:, 0]
    b[:, icol, 1] = a[:, 1]
    b[:, icol, 2] = df.columns[crng[0] + icol]
    b[:, icol, 3] = a[:, crng[0] + icol]

b = b.reshape((b.shape[0] * b.shape[1], b.shape[2]))

df = pd.DataFrame(data = b,
    columns = df.columns[:crng[0]].values.tolist() + ['fruit_type', 'fruit_consumption'],
)
print('output:\n', df)

推荐阅读