【问题标题】:Python: tidy data, how can I transform this table as I want? [duplicate]Python:整洁的数据,我怎样才能随心所欲地转换这个表? [复制]
【发布时间】:2021-07-26 13:49:15
【问题描述】:

我需要将我的表格从宽格式转换为长表格。该表有随时间变化的测量值,假设质量随时间变化:m0、m1、m2 等,所以它看起来像这样:

ID | Age | m0 | m1 | m2 | m3
1    67    72   69   66   67
2    70    80   81   79   77
3    72    69   69   70   70

我想要的是:

ID | Age | time | m
1    67     0     72
1    67     1     69
1    67     2     66
1    67     3     67
2    70     0     80
2    70     1     81
2    70     2     79
2    70     3     77
...

感谢您的帮助!提前谢谢你。

干杯。

【问题讨论】:

  • 您具体需要哪些帮助?你有没有尝试过?
  • 好问题,我已经尝试过 melt 函数,但最终得到的是 NaN 值或扭曲的索引。所以我想我可能需要更好地微调融化功能,这就是我需要帮助的地方。

标签: python pandas dataframe reshape


【解决方案1】:

这种情况下可以使用pandasmelt方法

result = df.melt(id_vars=['ID', 'Age'], value_vars=['m0', 'm1', 'm2', 'm3'])
result.columns = ['ID', 'Age', 'time', 'm']
result['time'] = result['time'].str.replace('m', '')
result = result.sort_values('Age').reset_index(drop=True)

print(result)
    ID  Age time   m
0    1   67    0  72
1    1   67    1  69
2    1   67    2  66
3    1   67    3  67
4    2   70    0  80
5    2   70    1  81
6    2   70    2  79
7    2   70    3  77
8    3   72    0  69
9    3   72    1  69
10   3   72    2  70
11   3   72    3  70

使用pd.wide_to_long的替代方法

result = pd.wide_to_long(df, stubnames=["m"], i=["ID", "Age"], j="").reset_index()
result.columns = ['ID', 'Age', 'time', 'm']
result = result.sort_values('Age').reset_index(drop=True)
print(result)
    ID  Age  time   m
0    1   67     0  72
1    1   67     1  69
2    1   67     2  66
3    1   67     3  67
4    2   70     0  80
5    2   70     1  81
6    2   70     2  79
7    2   70     3  77
8    3   72     0  69
9    3   72     1  69
10   3   72     2  70
11   3   72     3  70

如果有更多类似 m 的变量,可以在 stubnames
pd.wide_to_long 文档中提及它:https://pandas.pydata.org/docs/reference/api/pandas.wide_to_long.html

【讨论】:

  • 感谢您的解决方案!我还有一个问题,如果我有 8 个变量,比如 m,假设其中一个是高度 (h),我希望它作为 m 旁边的一列,我是否必须执行此步骤 8 次?
  • @WardNieboer 您可以对所有 8 列执行df.melt,也可以使用pd.wide_to_long,如更新的答案所示。这里也是文档pandas.pydata.org/docs/reference/api/pandas.wide_to_long.html
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 2016-06-15
  • 1970-01-01
  • 2019-04-28
  • 2019-04-09
  • 2022-11-29
  • 2022-10-14
  • 2021-10-30
相关资源
最近更新 更多