【问题标题】:Dataframe to pivot using pandas使用 pandas 进行旋转的数据框
【发布时间】:2021-06-04 00:53:52
【问题描述】:

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

 +----+---------------------+----
|    |   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  |
+----+---------------------+-----

我在做-->

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 的行和列。但拥有所有这些行/列很重要。

我怎样才能实现以下所需的输出。

 +------------------+-------+-----------+-----------
|      |  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        |
+----+---------------------+-----------+-------------

【问题讨论】:

    标签: python-3.x pandas dataframe pivot


    【解决方案1】:

    你快到了;在 pivot 之后,我们只需要使用 rename_axis 重命名轴并使用 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
    

    【讨论】:

    • 感谢您的回复。它确实帮助了我。我有一个大数据集,比如 500 * 500。在这种情况下,我会收到以下错误。 ValueError:索引包含重复条目,无法重塑。不幸的是,我不能把数据放在这里。你能帮我解决这个错误吗?
    • 我认为由于列或索引中重复的 NaN 而发生错误。
    • Index 中有重复项时会出现此错误。解决它的一种选择是 reset_index() 数据帧上的方法。这将创建序列从 0 开始的新索引,并将现有索引转换为列。
    • 即使将 reset_index() 添加到我的数据框后,我也无法解决该问题。我更新了给出错误的相同数据集。你能帮我检查一下吗! .
    • nw,让我看看
    猜你喜欢
    • 2017-12-15
    • 2022-12-04
    • 2017-11-25
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    相关资源
    最近更新 更多