获取python

时间:2016-10-31 18:56:00

标签: python pandas

假设我有一个pandas数据帧,如下所示,

数据

id  A   B   C   D   E
1   NaN 1   NaN 1   1
1   NaN 2   NaN 2   2
1   NaN 3   NaN NaN 3
1   NaN 4   NaN NaN 4
1   NaN 5   NaN NaN 5
2   NaN 6   NaN NaN 6
2   NaN 7   5   NaN 7
2   NaN 8   6   2   8
2   NaN 9   NaN NaN 9
2   NaN 10  NaN 4   10
3   NaN 11  NaN NaN 11
3   NaN 12  NaN NaN 12
3   NaN 13  NaN NaN 13
3   NaN 14  NaN NaN 14
3   NaN 15  NaN NaN 15
3   NaN 16  NaN NaN 16

我正在使用以下命令

pd.DataFrame(data.count().sort_values(ascending=False)).reset_index()

并获得以下输出,

    index   0
0   E       16
1   B       16
2   id      16
3   D        4
4   C        2
5   A        0

我想要以下输出,

columns count   unique(id) count
E         16           3
B         16           3
D          4           2
C          2           1
A          0           0

其中count与前一个相同,但唯一(id)计数是每个列的唯一ID。我希望两者都成为两个领域。

有人可以帮我这么做吗?

由于

1 个答案:

答案 0 :(得分:1)

从:

开始
In [7]: df
Out[7]: 
    id   A   B    C    D   E
0    1 NaN   1  NaN  1.0   1
1    1 NaN   2  NaN  2.0   2
2    1 NaN   3  NaN  NaN   3
3    1 NaN   4  NaN  NaN   4
4    1 NaN   5  NaN  NaN   5
5    2 NaN   6  NaN  NaN   6
6    2 NaN   7  5.0  NaN   7
7    2 NaN   8  6.0  2.0   8
8    2 NaN   9  NaN  NaN   9
9    2 NaN  10  NaN  4.0  10
10   3 NaN  11  NaN  NaN  11
11   3 NaN  12  NaN  NaN  12
12   3 NaN  13  NaN  NaN  13
13   3 NaN  14  NaN  NaN  14
14   3 NaN  15  NaN  NaN  15
15   3 NaN  16  NaN  NaN  16

这是一种相当不优雅的方式:

In [8]: (df.groupby('id').count() > 0).sum()
Out[8]: 
A    0
B    3
C    1
D    2
E    3
dtype: int64

因此,只需按照您的指定制作基座DataFrame

In [9]: counts = (df[['A','B','C','D','E']].count().sort_values(ascending=False)).to_frame(name='counts')

In [10]: counts
Out[10]: 
   counts
E      16
B      16
D       4
C       2
A       0

然后简单地说:

In [11]: counts['unique(id) counts'] = (df.groupby('id').count() > 0).sum()

In [12]: counts
Out[12]: 
   counts  unique(id) counts
E      16                  3
B      16                  3
D       4                  2
C       2                  1
A       0                  0