使用 pandas 进行数据透视的数据框

Dataframe to pivot using pandas

我正在将我的数据框转换为数据透视表 table。 这是我的数据框。

 +----+---------------------+----
|    |   A|   B|   C   | D     |
|----+---------------------+-----
|  0 |   a|  OK| one   | col1  |
|  1 |   b|  OK| two   | col1  |
|  2 |   c|  OK| two   | col2  |
|  3 |   d|  OK| Four  | NaN   |
|  4 |   e|  OK| Five  | NaN   |
|  5 |   f|  OK| Six   | NaN   |
|  6 |   g| NaN| NaN   | Col3  |
|  7 |   h| NaN| NaN   | Col4  |
|  8 |   i| NaN| NaN   | Col5  |
+----+---------------------+-----

I.m 正在做-->

pivot_data = df.pivot(index='C', columns = 'D', values = 'B')

这是我的输出。

 +------------------+-------+-----------+-------------+-----
|      |   NaN|   Col1|   col2 |   col3 |   col4 |   col5 |
|------------------+-------+-----------+-------------+------
| NaN  |   NaN|    NaN|     NaN|     NaN|     NaN|     NaN|
| four |    OK|    NaN|     NaN|     NaN|     NaN|     NaN|
| six  |    OK|    NaN|     NaN|     NaN|     NaN|     NaN|
| one  |   NaN|     OK|     NaN|     NaN|     NaN|     NaN|
| two  |   NaN|     OK|      OK|     NaN|     NaN|     NaN|
| five |   OK |    NaN|     NaN|     NaN|     NaN|     NaN|
+------------------+-------+-----------+-------------+------

这是我想要的输出。 当我使用 pivot_table 而不是 pivot 时,我没有得到所有值为 NaN 的行和列。但重要的是拥有所有这些 rows/cols.

我怎样才能达到下面想要的输出。

 +------------------+-------+-----------+-----------
|      |  Col1|   col2 |   col3 |   col4 |   col5 |
|------------------+-------+-----------+------------
| four |   NaN|     NaN|     NaN|     NaN|     NaN|
| six  |   NaN|     NaN|     NaN|     NaN|     NaN|
| one  |    OK|     NaN|     NaN|     NaN|     NaN|
| two  |    OK|      OK|     NaN|     NaN|     NaN|
| five |   NaN|     NaN|     NaN|     NaN|     NaN|
+------------------+-------+-----------+------------

谢谢。

更新:

更新的数据集给出了值错误:索引包含重复的条目。无法重塑。

 +----+---------------------+-----------+-----------
|    |   A   |          B|     C|      D          |
|----+---------------------+-----------+------------
|  0 |  3957 |         OK| One  | TM-009.4        |
|  1 |  3957 |         OK| two  | TM-009.4        |
|  2 |  4147 |         OK| three| CERT008         |
|  3 |  3816 |         OK| four | FITEYE-04       |
|  4 |  3955 |         OK| five | TM-009.2        |
|  5 |  4147 |         OK| six  | CERT008         |
|  6 |  4147 |         OK| seven| CERT008         |
|  7 |  3807 |         OK| seven| EMT-038.4       |
|  8 |   nan |         OK| eight| nan             |
|  9 |   nan |         OK| nine | nan             |
| 10 |   nan |         OK| ten  | nan             |
| 11 |   nan |         OK| 11   | nan             |
| 12 |   nan |         OK| 12   | nan             |
| 13 |   nan |         OK| 13   | nan             |
| 14 |   nan |         OK| 14   | nan             |
| 15 |   nan |         OK| 14   | nan             |
| 16 |  3814 |       nan | nan  | FITEYE-02       |
| 17 |  3819 |       nan | nan  | FITEYE-08       |
| 18 |  3884 |       nan | nan  | TG-000.8        |
| 19 |  4087 |       nan | nan  | TM-042.1        |
+----+---------------------+-----------+-------------

你快到了;在 pivot 之后,我们只需要使用不需要的 rename_axis and drop columns and index using drop 重命名轴。

代码

df[['C','D']] = df[['C','D']].fillna('NA') # To keep things simple while dropping col and index
df.pivot(index='C', columns = 'D', 
         values = 'B').rename_axis(index=None, columns=None).drop(columns='NA', index='NA')

输出

        col1    col2    col3    col4    col5
five    NaN     NaN     NaN     NaN     NaN
four    NaN     NaN     NaN     NaN     NaN
one     OK      NaN     NaN     NaN     NaN
six     NaN     NaN     NaN     NaN     NaN
two     OK      OK      NaN     NaN     NaN

更新 问题是因为 C column 中有重复的 NaN,因为我们从索引中删除 NaNs 无论如何我们可以删除重复项或首先完全删除它们。我在下面的解决方案中删除了重复项,您甚至可以根据要求完全删除它们。

代码

df[['C','D']] = df[['C','D']].fillna('NA')
df = df.drop_duplicates(['C'])
df.pivot(index = 'C', columns = 'D', values='B').rename_axis(index=None, columns=None).drop(columns='NA', index='NA')

输出

    CERT008 FITEYE-02   FITEYE-04   TM-009.2    TM-009.4
11  NaN     NaN         NaN         NaN         NaN
12  NaN     NaN         NaN         NaN         NaN
13  NaN     NaN         NaN         NaN         NaN
14  NaN     NaN         NaN         NaN         NaN
One NaN     NaN         NaN         NaN         OK
eight   NaN NaN         NaN         NaN         NaN
five    NaN NaN         NaN         OK          NaN
four    NaN NaN         OK          NaN         NaN
nine    NaN NaN         NaN         NaN         NaN
seven   OK  NaN         NaN         NaN         NaN
six     OK  NaN         NaN         NaN         NaN
ten     NaN NaN         NaN         NaN         NaN
three   OK  NaN         NaN         NaN         NaN
two     NaN NaN         NaN         NaN         OK