首页 > 解决方案 > 熊猫:按值将单元格值分组到各个列中

问题描述

我有一个带有多个偏移列的 pandas DataFrame:

        0       1       2       3        4         5          6
0  532201  577834  577837  839786  1003273       NaN        NaN
1  577834  577837  649835  839786  1003273       NaN        NaN
2  577834  577837  649835  839786  1003273       NaN        NaN
3  577834  577837  649839  649845   839785  839786.0  1003273.0
4  577834  577837  649839  839786  1003273       NaN        NaN
5  577834  577837  649839  839786  1003273       NaN        NaN
6  577834  577837  649839  839786  1003273       NaN        NaN

在缺失位置插入 NaN、-1 或其他值时,是否可以通过单元格的值有效地对列进行分组/排序?

输出:

        0       1       2       3       4       5       6       7        8
0  532201  577834  577837     NaN     NaN     NaN     NaN  839786  1003273
1     NaN  577834  577837  649835     NaN     NaN     NaN  839786  1003273
2     NaN  577834  577837  649835     NaN     NaN     NaN  839786  1003273
3     NaN  577834  577837     NaN  649839  649845  839785  839786  1003273
4     NaN  577834  577837     NaN  649839     NaN     NaN  839786  1003273
5     NaN  577834  577837     NaN  649839     NaN     NaN  839786  1003273
6     NaN  577834  577837     NaN  649839     NaN     NaN  839786  1003273

这些列不需要以任何特定方式排序,我只是想为上述每个值创建时间线图。

例如

.
.
.
649839       ======== 
577837  ================================
577834  ================================
532201  ===
         0    1    2    3    4    5    6

标签: pythonpandasdataframenumpy

解决方案


你可以和假人一起工作。stack,创建假人并用于max在行中的任何位置创建存在指标。

df1 = pd.get_dummies(df.stack().astype('int64')).max(level=0)

   532201   577834   577837   649835   649839   649845   839785   839786   1003273
0        1        1        1        0        0        0        0        1        1
1        0        1        1        1        0        0        0        1        1
2        0        1        1        1        0        0        0        1        1
3        0        1        1        0        1        1        1        1        1
4        0        1        1        0        1        0        0        1        1
5        0        1        1        0        1        0        0        1        1
6        0        1        1        0        1        0        0        1        1

如果您想创建类似的绘图,我们可以将虚拟对象乘以每列的不同常数(因此在绘图时它们会偏移),将 0 替换为NaN,并针对 DataFrame 的 RangeIndex 绘图。您可以使用图例来标记线条,或者使用 yticks 和标签,因此列标签位于 y 轴上。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(4, 4))

(df1.mul(np.arange(1, df1.shape[1]+1)).replace(0, np.NaN)
    .plot(ax=ax, marker='o', legend=False))

plt.yticks(np.arange(1, df1.shape[1]+1, 1))
ax.set_yticklabels(df1.columns)
plt.show()

在此处输入图像描述


推荐阅读