【问题标题】:How do I change the categorical rows to columns in python如何在python中将分类行更改为列
【发布时间】:2021-08-10 14:38:31
【问题描述】:

我需要一些关于在 python 中更改数据框的帮助。

     NODE      SIGNAL-STRENGTH   LOCATION 
0   A            76                 1 
1   A            78                 1
2   A            78                 1
3   A            79                 1
4   A            79                 2
5   A            70                 2
.
.
.
95  E            111                 4
96  E            123                 5
97  E            154                 5
98  E            113                 5
99  E            234                 5

上述数据是一个数据帧,其中有 5 个节点,每个节点有 20 个数据点,这些数据点是 5 个位置,每个位置向每个节点发送 4 个信号强度值。对于每个节点,我有来自一个位置和该位置本身的 4 个信号强度值。位置是标签,不同节点的信号强度不同。

我希望只有 20 行,6 列。其中一列将是位置。其他五个必须是节点并且具有该位置的信号强度。

位置顺序在 20 行后不会改变。这意味着20个位置在每个节点结束后都是有序的。

我尝试做 groupby 但我不知道如何将其更改为行。

最终数据框必须为

   LOCATION    NODEA_SIGNAL       NODE_B_SIGNAL    NODE_C_SIGNAL   NODE_D_SIGNAL NODE_E_SIGNAL
0   1            76                 34                 55              44           64
1   1            77                 33                 55              45           65
2   1            77                 33                 54              43           66
3   1            78                 31                 53              45           67
4   2            34                 42                 94              85           12
5   2            37                 44                 98              82           13
6   2            36                 45                 97              83           14
7   2            35                 44                 96              86           16
8   3            23                 16                 47              65           85
.
.
.
15  4            16                 24                 64              95           75
16  5            46                 74                 15              54           34
17  5            47                 73                 15              55           35
18  5            47                 73                 14              53           36
19  5            48                 71                 13              55           37

【问题讨论】:

    标签: python pandas dataframe data-wrangling


    【解决方案1】:

    你可以使用.pivot_table:

    df = (
        df.pivot_table(index="LOCATION", columns="NODE", values="SIGNAL-STRENGTH")
        .add_prefix("NODE_")
        .add_suffix("_SIGNAL")
        .reset_index()
    )
    df.columns.name = None
    print(df)
    

    打印:

       LOCATION  NODE_A_SIGNAL  NODE_B_SIGNAL  NODE_C_SIGNAL  NODE_D_SIGNAL  NODE_E_SIGNAL
    0         1             76             78             79            111            154
    1         2             78             79             70            123            113
    

    使用的数据:

      NODE  SIGNAL-STRENGTH  LOCATION
    0    A               76         1
    1    A               78         2
    2    B               78         1
    3    B               79         2
    4    C               79         1
    5    C               70         2
    6    D              111         1
    7    D              123         2
    8    E              154         1
    9    E              113         2
    

    【讨论】:

      【解决方案2】:

      设置

      data = {
          "NODE": [chr(j) for j in range(65, 65+5) for _ in range(j, j+20)],
          "SIGNAL-STRENGTH": np.random.randint(75, 200, 100),
          "LOCATION": np.arange(100) % 5 + 1
      }
      df = pd.DataFrame(data)
      df.sort_values(by=["NODE", 'LOCATION'], inplace=True)
      df.reset_index(drop=True, inplace=True)
      

      我唯一不知道的是当有更多行时如何获得LOCATION 的长度:

      data_new = {"LOCATION": [i//4 + 1 for i in range(20)]}
      

      主体:

      out_df = pd.DataFrame(data_new)
      for n, sub_df in df.groupby("NODE")["SIGNAL-STRENGTH"]:
          name = f"NODE_{n}_SIGNAL"
          out_df[name] = sub_df.reset_index(drop=True)
      out_df.to_markdown()
      
      |    |   LOCATION |   NODE_A_SIGNAL |   NODE_B_SIGNAL |   NODE_C_SIGNAL |   NODE_D_SIGNAL |   NODE_E_SIGNAL |
      |---:|-----------:|----------------:|----------------:|----------------:|----------------:|----------------:|
      |  0 |          1 |             161 |             109 |              90 |             138 |             185 |
      |  1 |          1 |              95 |              76 |             100 |             157 |              95 |
      |  2 |          1 |             113 |             107 |             140 |             195 |             188 |
      |  3 |          1 |             191 |             117 |             180 |             152 |              97 |
      |  4 |          2 |             196 |              97 |             119 |             176 |             107 |
      |  5 |          2 |             181 |             134 |             196 |             103 |             115 |
      |  6 |          2 |             160 |             138 |             110 |              79 |             165 |
      |  7 |          2 |             143 |              77 |             179 |             183 |             143 |
      |  8 |          3 |             127 |             139 |             198 |              95 |             151 |
      |  9 |          3 |             124 |             150 |             129 |             155 |             155 |
      | 10 |          3 |             147 |             126 |             110 |             131 |              92 |
      | 11 |          3 |              77 |             171 |             154 |             190 |             109 |
      | 12 |          4 |             156 |             154 |             133 |              89 |             163 |
      | 13 |          4 |              81 |             185 |             131 |             192 |              93 |
      | 14 |          4 |             144 |             140 |             124 |             131 |             151 |
      | 15 |          4 |             199 |             162 |             162 |             146 |             112 |
      | 16 |          5 |              80 |              89 |              94 |             147 |             190 |
      | 17 |          5 |             188 |             110 |             126 |             147 |             108 |
      | 18 |          5 |             125 |             163 |             159 |             108 |             186 |
      | 19 |          5 |             140 |             106 |             124 |             174 |              77 |
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        • 2021-10-10
        • 2018-10-30
        相关资源
        最近更新 更多