使用 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
我正在将我的数据框转换为数据透视表 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