【问题标题】:counting returned values of unique( )计算 unique() 的返回值
【发布时间】:2018-01-12 03:21:46
【问题描述】:

我有一个数据框,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' object has no attribute 'count'

【问题讨论】:

  • count() 不是有效的方法。试试len(st)st.size

标签: python pandas


【解决方案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

【讨论】:

  • @Bode 不客气。祝你工作顺利。
  • 如果 2 个数据帧的名称可以命名为 df2,df3,那将非常酷。当我将其更改为其他名称时,它不起作用。有什么想法吗?
  • @Bode 你只需要修改这行:idx.append('df{}'.format(i)) 用你喜欢的任何名字。
  • 对不起,我的意思是 4 个数据帧,名称如下:dty、fre、gst 和 dev。所以我将所有这些名称放在 df_list[dty,dtt,dst,dve] 但索引仍然是默认的 python 索引而不是数据帧的名称
【解决方案2】:

根据https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.html 上的文档,我怀疑您想要的是大小,而不是计数。

size 给出了 ndarray 中的项目数。

【讨论】:

  • 不,这不能回答问题。
猜你喜欢
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
相关资源
最近更新 更多