2017-10-09 53 views
4

我试图找到一个数据框中给定单词的概率,但我得到一个AttributeError: 'Series' object has no attribute 'columns'错误与我目前的设置。希望你能帮我找到错误的地方。熊猫值的概率

我从一个类似于下图的数据框开始,通过下面的函数转换它以查找每个单词的总计数。下面

query   count 
foo bar  10 
super   8 
foo   4 
super foo bar 2 

功能:

def _words(df): 
    return df['query'].str.get_dummies(sep=' ').T.dot(df['count']) 

在下面的DF得到的(注意 '富' 是16,因为它出现在整个DF 16次):

bar  12 
foo  16 
super 10 

问题来在尝试查找df中给定关键字的概率时,它当前不会附加列名称。以下是我目前正在处理的内容,但它抛出了“AttributeError:'Series'对象没有属性”列“的错误。

def _probability(df, query): 
    return df[query]/df.groupby['count'].sum() 

我希望调用_probability(DF, '富')将返回0.421052632(16 /(12 + 16 + 10))。提前致谢!

+0

你可以发布你想要的数据集吗? – MaxU

回答

3

你可以在它的结束抛出管:

df['query'].str.get_dummies(sep=' ').T.dot(df['count']).pipe(lambda x: x/x.sum()) 

bar  0.315789 
foo  0.421053 
super 0.263158 
dtype: float64 

从头开始:
这是比较复杂的,但速度更快

from numpy.core.defchararray import count 

q = df['query'].values 
c = df['count'].values.repeat(count(q.astype(str), ' ') + 1) 
f, u = pd.factorize(' '.join(q.tolist()).split()) 
b = np.bincount(f, c) 
pd.Series(b/b.sum(), u) 

foo  0.421053 
bar  0.315789 
super 0.263158 
dtype: float64 
0

我认为你正在在GROUPBY错误(这是一个功能和应遵循的括号)

尝试:

def _probability(df, query): 
    return df[query]/df.groupby('count').sum() 
3

IIUC:

In [111]: w = df['query'].str.get_dummies(sep=' ').T.dot(df['count']) 

In [112]: w 
Out[112]: 
bar  12 
foo  16 
super 10 
dtype: int64 

In [113]: w/df['count'].sum() 
Out[113]: 
bar  0.500000 
foo  0.666667 
super 0.416667 
dtype: float64 

或类似这样的东西(取决于你的目标):

In [135]: df.join(df['query'].str.get_dummies(sep=' ') \ 
      .mul(df['count'], axis=0).div(df['count'].sum())) 
Out[135]: 
      query count  bar  foo  super 
0  foo bar  10 0.416667 0.416667 0.000000 
1   super  8 0.000000 0.000000 0.333333 
2   foo  4 0.000000 0.166667 0.000000 
3 super foo bar  2 0.083333 0.083333 0.083333 
+0

'.dot'太神奇了〜:) – Wen

+0

@Wen,原来是在这个问题上...... ;-) – MaxU

+1

这就是@ piRsquared的天才回复几天后 – Vaishali

2
df['query']=df['query'].str.split(' ')  
df.set_index('count')['query'].apply(pd.Series).stack().reset_index().groupby(0)['count'].sum() 
Out[491]: 
0 
bar  12 
foo  16 
super 10 
Name: count, dtype: int64 
3

为什么不将新的数据框传递给函数?

df1 = df['query'].str.get_dummies(sep=' ').T.dot(df['count']) 

def _probability(df, query): 
    return df[query]/df.sum() 

_probability(df1, 'foo') 

你得到

0.42105263157894735