计算unique()的返回值

时间:2018-01-11 18:51:50

标签: python pandas

我有一个数据框,df1

     Date        inp  name   
0  2017-08-07  2.3.6  ABC 
1  2017-08-07  2.3.6  ABC      
2  2017-08-08  2.3.6  TAC         
3  2017-08-22  2.5.9  TTT         
4  2017-09-23  0.8.0  TAC         
5  2017-10-09  2.3.6  ABC         
6  2017-10-09  2.3.6  TAC
7  2017-10-09  2.3.6  TAC                  
8  2017-10-23  0.8.0  TAC         
9  2017-11-08  6.2.6  ABC        

然后是另一个数据帧,df2

                2.3.6ABC  2.3.6TAC  2.5.9TTT      
August            2         1            0            
September         0         0            0             
October           1         2            0             
November          0         0            1             

另一个数据帧,df3

                2.3.6ABC  2.3.6TAC       
August            2         1                      
September         0         0                         
October           1         2                        
November          0         0                        

我想得到列中的不同值:df1的'inp',在这种情况下为4.然后,df2和df3的列数在这种情况下为3和2。如何通过重命名索引将2个数据帧的列数df2和df3存储在新数据帧中,然后在df1中获取百分比df2和df3。它应该是这样的:

                     noOfColumn      pct
    df2 as sat         3         3/4=75                      
    df3 as nath        2         2/4=50                        

我无法超越这一点

st=pd.Dataframe(df1)
st=df['inp'].unique()
st2=st.count()

因为我不断得到这个:AttributeError:'numpy.ndarray'对象没有属性'count'

2 个答案:

答案 0 :(得分:1)

根据https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.html

的文档,我怀疑你想要的是尺寸,而不是数量

size给出了ndarray中的项目数。

答案 1 :(得分:1)

维护数据框列表 -

df_list = [df2, df3]

在循环中,构建一个系列列表(还有其他方法可以做到这一点,但这里有一个),列数和索引具有名称 -

r = [
     pd.Series(len(df.columns), index=['df{}'.format(i)]) 
     for i, df in enumerate(df_list, 2)
]

或者,

r = []
for i, df in enumerate(df_list, 2):
    r.append(pd.Series(len(df.columns), index=['df{}'.format(i)]))

现在,连接并计算pct更改。此外,您希望nunique获取唯一值的数量(unique + size,因为其他答案建议不是pandaic) -

v = pd.concat(r).to_frame(name='noOfColumn')  
v['pct'] = v['noOfColumn'] / df1.inp.nunique()

v

     noOfColumn   pct
df2           3  0.75
df3           2  0.50

另一种方法是在单独的列表中收集索引和值,并调用DataFrame构造函数一次 -

idx, v = [], []
for i, df in enumerate(df_list, 2):
    idx.append('df{}'.format(i))
    v.append(len(df.columns))

最后,

df = pd.DataFrame(v, index=idx, columns=['noOfColumn'])
df['pct'] = df['noOfColumn'] / df1.inp.nunique()

df    
     noOfColumn   pct
df2           3  0.75
df3           2  0.50