繁体   English   中英

熊猫数据框

[英]Pandas Dataframes

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

GroupBy是您的朋友在这里。 我没有找到指向excel文件的任何链接。 我假设您有一个包含情绪信息的竞争对手表格(我猜是1和0)。 您需要做的第一件事就是添加竞争对手的名称。 您可以通过2种方式执行此操作,或者将其添加到excel工作表本身中,或者在您像这样阅读excel工作表后:

df1 = pd.read_excel(PATH_DATA, 'A')
df1['competitor'] = 'A'

这将添加一个名为“竞争者”的值“ 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方法才能将数据框传递给类。 您当前的代码引发异常。

另请注意,我已将groupby与as_index = False一起使用。 这允许您要查找的sql样式groupby。 因此,您可以替换:

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)

这将返回带有所需输出的熊猫数据框。

希望有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM