Python 数据帧的计数、平均和连接
我在Pandas中有一个数据框架,其中包含一组产品评论,这些产品与一些评论网站的产品略有不同。每次评审都与一个产品相关,并带有一个数字分数。评论也有一个文本字段,包含每个评论的文本(相当长的字段),以及它所来自的源站点的名称。 例如 我想将每个产品组合在一个新表中,以便分析每个产品是如何被评审的。我将最终执行文本分析(词性标记等),以了解每个产品是如何被审查的 我想首先创建一个新的数据框,按“产品”分组。我想计算每个产品在“计数”列中的评论数。分组时,将有一列计算“分数”的平均值。还将有一个列,其中组合了每个产品的文本字段,以便可以将审查文本作为一个整体进行分析,而不是单独进行分析。 例如 “source”列在这个特定的分析中不是必需的,但我包含它只是为了表明数据框架中还有其他列 从这一点上,我可以更容易地分解每个产品的文本,而不是单独的评论 提前谢谢 您可以使用: 编辑: 输出中含有Python 数据帧的计数、平均和连接,python,pandas,dataframe,aggregate,Python,Pandas,Dataframe,Aggregate,我在Pandas中有一个数据框架,其中包含一组产品评论,这些产品与一些评论网站的产品略有不同。每次评审都与一个产品相关,并带有一个数字分数。评论也有一个文本字段,包含每个评论的文本(相当长的字段),以及它所来自的源站点的名称。 例如 我想将每个产品组合在一个新表中,以便分析每个产品是如何被评审的。我将最终执行文本分析(词性标记等),以了解每个产品是如何被审查的 我想首先创建一个新的数据框,按“产品”分组。我想计算每个产品在“计数”列中的评论数。分组时,将有一列计算“分数”的平均值。还将有一个列,
dict
的解决方案:
from collections import Counter
df = df.groupby('product')
.agg({'score':'mean', 'product':'size', 'text': ', '.join, 'source': lambda x: [dict(Counter(x))]})
#change order of columns, create column from index values
df = df.reindex_axis(['score','product','text', 'source'], axis=1)
.rename_axis('a')
.reset_index()
#set new column names
df.columns = ['product','mean_score','count','text_combined', 'count_sources']
df['L'] = pd.Series(df.values.tolist())
print (df)
product mean_score count text_combined \
0 K3 3.666667 3 long-text, paragraph, texts-on-text
1 P2 3.500000 2 text, more-text
2 i7 1.000000 1 review-text
count_sources \
0 [{'site1': 1, 'site2': 1, 'site5': 1}]
1 [{'site7': 1, 'site2': 1}]
2 [{'site4': 1}]
L
0 [K3, 3.6666666666666665, 3, long-text, paragra...
1 [P2, 3.5, 2, text, more-text, [{'site7': 1, 's...
2 [i7, 1.0, 1, review-text, [{'site4': 1}]]
from collections import Counter
df = df.groupby('product')
.agg({'score':'mean', 'product':'size', 'text': ', '.join, 'source': lambda x: list(dict(Counter(x)).items())})
#change order of columns, create column from index values
df = df.reindex_axis(['score','product','text', 'source'], axis=1)
.rename_axis('a')
.reset_index()
#set new column names
df.columns = ['product','mean_score','count','text_combined', 'count_sources']
df['L'] = pd.Series(df.values.tolist())
print (df)
product mean_score count text_combined \
0 K3 3.666667 3 long-text, paragraph, texts-on-text
1 P2 3.500000 2 text, more-text
2 i7 1.000000 1 review-text
count_sources \
0 [(site1, 1), (site2, 1), (site5, 1)]
1 [(site7, 1), (site2, 1)]
2 [(site4, 1)]
L
0 [K3, 3.6666666666666665, 3, long-text, paragra...
1 [P2, 3.5, 2, text, more-text, [(site7, 1), (si...
2 [i7, 1.0, 1, review-text, [(site4, 1)]]
和输出中带有元组的解决方案:
from collections import Counter
df = df.groupby('product')
.agg({'score':'mean', 'product':'size', 'text': ', '.join, 'source': lambda x: [dict(Counter(x))]})
#change order of columns, create column from index values
df = df.reindex_axis(['score','product','text', 'source'], axis=1)
.rename_axis('a')
.reset_index()
#set new column names
df.columns = ['product','mean_score','count','text_combined', 'count_sources']
df['L'] = pd.Series(df.values.tolist())
print (df)
product mean_score count text_combined \
0 K3 3.666667 3 long-text, paragraph, texts-on-text
1 P2 3.500000 2 text, more-text
2 i7 1.000000 1 review-text
count_sources \
0 [{'site1': 1, 'site2': 1, 'site5': 1}]
1 [{'site7': 1, 'site2': 1}]
2 [{'site4': 1}]
L
0 [K3, 3.6666666666666665, 3, long-text, paragra...
1 [P2, 3.5, 2, text, more-text, [{'site7': 1, 's...
2 [i7, 1.0, 1, review-text, [{'site4': 1}]]
from collections import Counter
df = df.groupby('product')
.agg({'score':'mean', 'product':'size', 'text': ', '.join, 'source': lambda x: list(dict(Counter(x)).items())})
#change order of columns, create column from index values
df = df.reindex_axis(['score','product','text', 'source'], axis=1)
.rename_axis('a')
.reset_index()
#set new column names
df.columns = ['product','mean_score','count','text_combined', 'count_sources']
df['L'] = pd.Series(df.values.tolist())
print (df)
product mean_score count text_combined \
0 K3 3.666667 3 long-text, paragraph, texts-on-text
1 P2 3.500000 2 text, more-text
2 i7 1.000000 1 review-text
count_sources \
0 [(site1, 1), (site2, 1), (site5, 1)]
1 [(site7, 1), (site2, 1)]
2 [(site4, 1)]
L
0 [K3, 3.6666666666666665, 3, long-text, paragra...
1 [P2, 3.5, 2, text, more-text, [(site7, 1), (si...
2 [i7, 1.0, 1, review-text, [(site4, 1)]]
难以置信的响应时间,它给了我我想要的!非常感谢,现在看起来很简单另一个问题:如果我想创建一个字段,其中所有源(每个源都有一个计数)都添加到单个列中的列表中,该怎么办。。。这可能吗?例如,| K3 | 3.66 | 3 | longtext…|[(Site1,1),(Site3,1),(Site5,1)],其中元组的第一部分(或dict)是站点名称,第二部分是该站点对该产品的评论数请稍等。可能[]
带计数器的可以省略,这取决于您需要什么。
from collections import Counter
df = df.groupby('product')
.agg({'score':'mean', 'product':'size', 'text': ', '.join, 'source': lambda x: list(dict(Counter(x)).items())})
#change order of columns, create column from index values
df = df.reindex_axis(['score','product','text', 'source'], axis=1)
.rename_axis('a')
.reset_index()
#set new column names
df.columns = ['product','mean_score','count','text_combined', 'count_sources']
df['L'] = pd.Series(df.values.tolist())
print (df)
product mean_score count text_combined \
0 K3 3.666667 3 long-text, paragraph, texts-on-text
1 P2 3.500000 2 text, more-text
2 i7 1.000000 1 review-text
count_sources \
0 [(site1, 1), (site2, 1), (site5, 1)]
1 [(site7, 1), (site2, 1)]
2 [(site4, 1)]
L
0 [K3, 3.6666666666666665, 3, long-text, paragra...
1 [P2, 3.5, 2, text, more-text, [(site7, 1), (si...
2 [i7, 1.0, 1, review-text, [(site4, 1)]]