错误'AttributeError:'DataFrameGroupBy'对象没有属性'而数据框上的groupby功能
Posted
技术标签:
【中文标题】错误\'AttributeError:\'DataFrameGroupBy\'对象没有属性\'而数据框上的groupby功能【英文标题】:Error 'AttributeError: 'DataFrameGroupBy' object has no attribute' while groupby functionality on dataframe错误'AttributeError:'DataFrameGroupBy'对象没有属性'而数据框上的groupby功能 【发布时间】:2018-03-14 01:32:18 【问题描述】:我有一个数据框news_count
。以下是它的列名,来自news_count.columns.values
的输出:
[('date', '') ('EBIX UW Equity', 'NEWS_SENTIMENT_DAILY_AVG') ('Date', '')
('day', '') ('month', '') ('year', '')]
我需要按年和月计算groupby
以及'NEWS_SENTIMENT_DAILY_AVG'
的总和值。以下是我尝试过的代码,但都不起作用:
尝试 1
news_count.groupby(['year','month']).NEWS_SENTIMENT_DAILY_AVG.values.sum()
'AttributeError: 'DataFrameGroupBy' object has no attribute'
尝试 2
news_count.groupby(['year','month']).iloc[:,1].values.sum()
AttributeError: Cannot access callable attribute 'iloc' of 'DataFrameGroupBy' objects, try using the 'apply' method
输入数据:
ticker date EBIX UW Equity month year
field NEWS_SENTIMENT_DAILY_AVG
0 2007-05-25 0.3992 5 2007
1 2007-11-06 0.3936 11 2007
2 2007-11-07 0.2039 11 2007
3 2009-01-14 0.2881 1 2014
【问题讨论】:
你试过news_count.groupby(['year','month']).NEWS_SENTIMENT_DAILY_AVG.sum()
吗?
问题是它没有识别NEWS_SENTIMENT_DAILY_AVG
列。错误消息 - AttributeError: 'DataFrameGroupBy' object has no attribute 'NEWS_SENTIMENT_DAILY_AVG'
您在使用多列索引吗?
Reset_index 适用于索引,而不是列...
我不确定我可以吗?因为我不是 100% 确定我了解您的数据框的结构,所以这些列看起来很糟糕。尝试明确地重新分配它们:df.columns = ['date', 'avg', 'day', 'month', 'year', ...]
等等。如果可以,请更新您的数据框,并在我的第一条评论中再次尝试我的建议。
【参考方案1】:
从 news_count_res
变量中的数据框中提取所需的列,然后应用聚合函数
news_count_res = news_count[['year','month','NEWS_SENTIMENT_DAILY_AVG']]
news_count_res.group(['year','month']).sum()
【讨论】:
感谢您...但我在“df_sample = df.groupby("persons").sample(frac= percent_to_flag, random_state=random_state)”。如果我能弄清楚原因,也许它对我有用......【参考方案2】:感谢到目前为止的答案(我已经在那里制作了 cmets,因为我没有这些解决方案可以工作 - 也许我不明白某些东西)。与此同时,我还提出了另一种方法,我仍然怀疑它不是 Pythonic。它确实完成了工作,并且不会花费太长时间来达到我的目的,但是如果我能弄清楚如何调整上面建议的方法以使它们发挥作用,那就太好了……欢迎任何想法!
这是我得到的:
import pandas as pd
import math
y = ['Alex'] * 2321 + ['Doug'] * 34123 + ['Chuck'] * 2012 + ['Bob'] * 9281
z = ['xyz'] * len(y)
df = pd.DataFrame('persons': y, 'data' : z)
percent = 10 #CHANGE AS NEEDED
#add a 'helper'column with random numbers
df['rand'] = np.random.random(df.shape[0])
df = df.sample(frac=1) #optional: this shuffles data, just to show order doesn't matter
#CREATE A HELPER LIST
helper = pd.DataFrame(df.groupby('persons')['rand'].count()).reset_index().values.tolist()
for row in helper:
df_temp = df[df['persons'] == row[0]][['persons','rand']]
lim = math.ceil(len(df_temp) * percent * 0.01)
row.append(df_temp.nlargest(lim,'rand').iloc[-1][1])
def flag(name,num):
for row in helper:
if row[0] == name:
if num >= row[2]:
return 'yes'
else:
return 'no'
df['flag'] = df.apply(lambda x: flag(x['persons'], x['rand']), axis=1)
并检查结果:
piv = df.pivot_table(index="persons", columns="flag", values="data", aggfunc='count', fill_value=0)
piv = piv.apivend(piv.sum().rename('Total')).assign(Total=lambda x: x.sum(1))
piv['% selected'] = 100 * piv.yes/piv.Total
print(piv)
OUTPUT:
flag no yes Total % selected
persons
Alex 2088 233 2321 10.038776
Bob 8352 929 9281 10.009697
Chuck 1810 202 2012 10.039761
Doug 30710 3413 34123 10.002051
Total 42960 4777 47737 10.006913
似乎可以与不同的 %s 和不同数量的人一起工作……但我认为最好让它更简单。
【讨论】:
以上是关于错误'AttributeError:'DataFrameGroupBy'对象没有属性'而数据框上的groupby功能的主要内容,如果未能解决你的问题,请参考以下文章
错误'AttributeError:'DataFrameGroupBy'对象没有属性'而数据框上的groupby功能
Python 多处理库错误(AttributeError:__exit__)
出现错误AttributeError:'_tkinter.tkapp'对象没有属性'getitems'
Python 错误:AttributeError:“模块”对象没有属性“heappush”
AttributeError:“切片”对象没有属性“标志”错误
readline() 方法给出错误:AttributeError: 'tuple' object has no attribute 'readline'