我还是python的新手,需要帮助设置数据帧。 我有一个包含5个竞争对手的数据集,3个可能的情绪和一个名为调整计数的数字。以下是一个示例数据文件:https://www.sendspace.com/file/0xfh5s
我需要创建一个数据框,其中包含情绪和调整后计数的总和。
它应该是这样的:
Positive Balanced Negative Grand Total
A 335 208 33 576
B 346 170 97 613
C 573 90 454 1117
D 1955 1456 1762 5173
E 253 0 189 442
Grand Total 3462 1924 2535 7921
但相反,这就是我目前所得到的:
Positive Balanced Negative Total
A 0 0 0 0
B 0 0 0 0
C 0 0 0 0
D 0 0 0 0
E 0 0 0 0
这是我目前的代码:
PATH_DATA = '...filename.xlsx'
df1 = pd.read_excel(PATH_DATA, 'A')
df2 = pd.read_excel(PATH_DATA, 'B')
df3 = pd.read_excel(PATH_DATA, 'C')
df4 = pd.read_excel(PATH_DATA, 'D')
df5 = pd.read_excel(PATH_DATA, 'E')
df_ALL = pd.concat([df1, df2, df3, df4, df5])
SENTIMENT_DIMENTION = 'Sentiment simplified'
SENTIMENT_ORDER = ['Positive', 'Balanced', 'Negative']
COMPETITOR_DIMENTION = 'Competitor Name'
COMPETITOR_ORDER = ['A', 'B', 'C', 'D', 'E']
AC_DIMENTION = 'Adjusted Count'
class Report:
def ACbysentiment(self, vdimention, hdimention, indexlist):
data = self.data
data = data.groupby([vdimention, hdimention]).size().unstack(1)
#data = data.groupby('Adjusted Count')[sumdimention].agg('sum')
data = data.reindex(columns=indexlist)
data['Total'] = data.sum(axis=1)
data.fillna(0, inplace = True)
data = data.sort_values('Total', ascending=True)
return data
df_ALL = df_ALL.replace(np.nan, NAN_VAL, regex=True)
S1 = Report(df_ALL)
S1_Competitor_Sentiment_AC = S1.ACbysentiment(COMPETITOR_DIMENTION, AC_DIMENTION, SENTIMENT_ORDER)
S1_Competitor_Sentiment_AC = pd.DataFrame(S1_Competitor_Sentiment_AC, index = COMPETITOR_ORDER)
非常感谢您给予的任何帮助!
由于
以下是df_ALL的样子:
Competitor Sentiment simplified Adjusted Count
A Positive 50
A Balanced 40
A Negative 30
A Positive 10
B Balanced 50
B Negative 40
B Positive 30
B Balanced 10
B Negative 50
B Positive 40
C Balanced 30
C Negative 10
C Positive 50
C Balanced 40
C Negative 30
D Positive 10
D Balanced 50
D Negative 40
E Positive 30
E Balanced 10
E Negative 50
E Positive 40
E Balanced 30
E Negative 10
E Positive 50
答案 0 :(得分:1)
GroupBy是你的朋友。我没有找到任何指向excel文件的链接。我假设你有一张竞争对手的表格,里面有情绪信息(我想是1&0; s和0' s)。首先,您需要添加竞争对手的名称。您可以通过两种方式执行此操作,或者将其添加到Excel工作表中,或者在您阅读excel工作表之后:
df1 = pd.read_excel(PATH_DATA, 'A')
df1['competitor'] = 'A'
这将添加一个名为competitor的列,其值为' A'。在您的情况下,竞争对手的价值是必不可少的,因为您将汇总此值。对所有数据帧完成此操作后,您应该将它们连接起来:
df_ALL = pd.concat([df1, df2, df3, df4, df5])
在此之后,您可以在数据框上应用groupby:
df_grouped = df_All.groupby(by='competitor',as_index = False).sum()
编辑:基于类的解决方案
class Report:
def __init__(self,dataframe):
self.data = dataframe
def ACbysentiment(self, vdimention, hdimention):
data = self.data
data = data.groupby(by=[vdimention, hdimention],as_index=False).sum()
data = data.pivot(index='Competitor',columns = 'Sentiment simplified',values='Adjusted Count')
data['Total'] = data.sum(axis=1)
#data.fillna(0, inplace = True) not required as we are aggregating
data = data.sort_values('Total', ascending=True)
return data
注意:需要使用init方法将数据帧传递给类。您当前的代码会抛出异常。
另请注意,我使用了asby与as_index = False。这允许您正在寻找的sql样式组。所以你可以替换:
data = data.groupby([vdimention, hdimention]).size().unstack(1)
带
data = data.groupby(by=[vdimention, hdimention],as_index=False).sum()
最后,如果我理解正确,您希望(在excel术语中)转动数据,以便我们使用df.Pivot()方法:
data = data.pivot(index='Competitor',columns = 'Sentiment simplified',values='Adjusted Count')
我也认为你并不需要各种各样的维度'您已定义的内容(除非它们在您的代码中的其他位置使用)。你只需要两个:
COMPETITOR_DIMENTION = 'Competitor' # just the name of the column,case sensitive
AC_DIMENTION = 'Sentiment simplified'
然后:
S1_Competitor_Sentiment_AC = S1.ACbysentiment(COMPETITOR_DIMENTION, AC_DIMENTION)
这将返回带有所需输出的pandas数据帧。
希望有所帮助!