[英]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.