我试图在数据框中找到给定单词的概率,但我在当前设置中遇到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))。提前致谢!
答案 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()