熊猫数据帧

时间:2018-06-13 09:16:19

标签: python python-3.x pandas dataframe

我还是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

1 个答案:

答案 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数据帧。

希望有所帮助!