大熊猫价值的可能性

时间:2017-10-09 21:24:38

标签: python pandas

我试图在数据框中找到给定单词的概率,但我在当前设置中遇到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(注意' foo'是16,因为它在整个df中出现16次):

bar      12
foo      16
super    10

当试图在df中找到给定关键字的概率时会出现问题,该关键字当前不附加列名。以下是我目前正在使用的内容,但它正在抛出"属性错误:'系列'对象没有属性'列'"错误。

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

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:0)

我认为你在groupby中犯了错误(这是一个函数,后面应该是括号)

尝试:

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