基于值数据类型转置 pandas DF

dun*_*bok 6 python dataframe pandas

我有 pandas DataFrameA。我正在努力将其转换为我想要的格式,请参阅DataFrameB。我尝试过pivotmelt但我不确定如何使其成为有条件的(string值 to FIELD_STR_VALUEnumeric值 to FIELD_NUM_VALUE)。我希望你能为我指明正确的方向。

A:输入数据框

|FIELD_A |FIELD_B |FIELD_C |FIELD_D |
|--------|--------|--------|--------|
|123123  |8       |a       |23423   |
|123124  |7       |c       |6464    |
|123144  |99      |x       |234     |
Run Code Online (Sandbox Code Playgroud)

B:所需的输出数据帧

|ID |FIELD_A |FIELD_NAME |FIELD_STR_VALUE |FIELD_NUM_VALUE |
|---|--------|-----------|----------------|----------------|
|1  |123123  |B          |                |8               |
|2  |123123  |C          |a               |                |
|3  |123123  |D          |                |23423           |
|4  |123124  |B          |                |7               |
|5  |123124  |C          |c               |                |
|6  |123124  |D          |                |6464            |
|7  |123144  |B          |                |99              |
|8  |123144  |C          |x               |                |
|9  |123144  |D          |                |234             |
Run Code Online (Sandbox Code Playgroud)

moz*_*way 5

您可以使用:

# dic = {np.int64: 'NUM', object: 'STR'}

(df.set_index('FIELD_A')
   .pipe(lambda d: d.set_axis(pd.MultiIndex.from_arrays(
          [d.columns, d.dtypes],
         # or for custom NAMES
         #[d.columns, d.dtypes.map(dic)],
                              names=['FIELD_NAME', None]),
                              axis=1)
        )
   .stack(0).add_prefix('FIELD_').add_suffix('_VALUE')
   .reset_index()
)
Run Code Online (Sandbox Code Playgroud)

注意。如果您确实想要 STR/NUM,map则来自 dtypes 的那些字符串(请参阅代码中的注释)。

输出:

   FIELD_A FIELD_NAME  FIELD_int64_VALUE FIELD_object_VALUE
0   123123    FIELD_B                8.0                NaN
1   123123    FIELD_C                NaN                  a
2   123123    FIELD_D            23423.0                NaN
3   123124    FIELD_B                7.0                NaN
4   123124    FIELD_C                NaN                  c
5   123124    FIELD_D             6464.0                NaN
6   123144    FIELD_B               99.0                NaN
7   123144    FIELD_C                NaN                  x
8   123144    FIELD_D              234.0                NaN
Run Code Online (Sandbox Code Playgroud)

  • 如果您有疑问请告诉我(我可能不会立即回答,可能会AFK) (2认同)