需要重塑我的数据帧(许多列名)

2024-09-28 17:31:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图重塑熊猫的数据帧。我目前有一个id变量,其余变量的格式如下:“variableyear”,其中年份介于2000年和2016年之间。我想创建一个新的变量year(从variableyear变量中提取年份),并创建一个名为variable的列。下面是一个与我的真实数据集相似的示例数据集(因为我的数据是机密的):


    |  name   | income2015 | income2016 | children2015 | children2016 | education2015 | education2016 
 ---|---------|------------|------------|--------------|--------------|---------------|--------------- 
  0 | John    |          1 |          4 |            7 |           10 |            13 |            16 
  1 | Phillip |          2 |          5 |            8 |           11 |            14 |            17 
  2 | Carl    |          3 |          6 |            9 |           12 |            15 |            18 

这就是我想要的:

    |  name   | year | income | children | education 
 ---|---------|------|--------|----------|----------- 
  0 | John    | 2015 |      1 |        7 |        13 
  1 | Phillip | 2015 |      2 |        8 |        14 
  2 | Carl    | 2015 |      3 |        9 |        15 
  3 | John    | 2016 |      4 |       10 |        16 
  4 | Phillip | 2016 |      5 |       11 |        17 
  5 | Carl    | 2016 |      6 |       12 |        18 

我已经尝试了以下方法:

df2 = pd.melt(df, id_vars=['name'], value_vars=df.columns[1:])
df2['year'] = df2['variable'].map(lambda x: x[-4:])
df2['variable'] = df2['variable'].map(lambda x: x[:-4])

这让我想到:

       |          |           |      |      
 ------|----------|-----------|------|------ 
  name | variable | value     | year |      
  0    | John     | income    | 1    | 2015 
  1    | Phillip  | income    | 2    | 2015 
  2    | Carl     | income    | 3    | 2015 
  3    | John     | income    | 4    | 2016 
  4    | Phillip  | income    | 5    | 2016 
  5    | Carl     | income    | 6    | 2016 
  6    | John     | children  | 7    | 2015 
  7    | Phillip  | children  | 8    | 2015 
  8    | Carl     | children  | 9    | 2015 
  9    | John     | children  | 10   | 2016 
  10   | Phillip  | children  | 11   | 2016 
  11   | Carl     | children  | 12   | 2016 
  12   | John     | education | 13   | 2015 
  13   | Phillip  | education | 14   | 2015 
  14   | Carl     | education | 15   | 2015 
  15   | John     | education | 16   | 2016 
  16   | Phillip  | education | 17   | 2016 
  17   | Carl     | education | 18   | 2016 

但现在我必须重新塑造。。。有更简单的方法吗?你知道吗

另外,这是我的字典格式的df:

{'children2015': {0: 7, 1: 8, 2: 9}, 'children2016': {0: 10, 1: 11, 2: 12}, 'education2015': {0: 13, 1: 14, 2: 15}, 'education2016': {0: 16, 1: 17, 2: 18}, 'income2015': {0: 1, 1: 2, 2: 3}, 'income2016': {0: 4, 1: 5, 2: 6}, 'name': {0: 'John', 1: 'Phillip', 2: 'Carl'}}

Tags: 数据nameiddf格式johnvariableyear
1条回答
网友
1楼 · 发布于 2024-09-28 17:31:31

实际上,您可以使用pd.wide_to_long来实现这一点。在stubnames参数中,可以使用以下代码在df中使用一组变量名(不包括name并删除最后4个字符:set([x[:-4] for x in df.columns[1:]]))。你知道吗

pd.wide_to_long(df,stubnames=set([x[:-4] for x in df.columns[1:]]),i=['name'],j='year').reset_index()

输出:

    name    year    education   income  children
0   John    2015    13          1       7
1   Phillip 2015    14          2       8
2   Carl    2015    15          3       9
3   John    2016    16          4       10
4   Phillip 2016    17          5       11
5   Carl    2016    18          6       12

相关问题 更多 >