Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧的计数、平均和连接_Python_Pandas_Dataframe_Aggregate - Fatal编程技术网

Python 数据帧的计数、平均和连接

Python 数据帧的计数、平均和连接,python,pandas,dataframe,aggregate,Python,Pandas,Dataframe,Aggregate,我在Pandas中有一个数据框架,其中包含一组产品评论,这些产品与一些评论网站的产品略有不同。每次评审都与一个产品相关,并带有一个数字分数。评论也有一个文本字段,包含每个评论的文本(相当长的字段),以及它所来自的源站点的名称。 例如 我想将每个产品组合在一个新表中,以便分析每个产品是如何被评审的。我将最终执行文本分析(词性标记等),以了解每个产品是如何被审查的 我想首先创建一个新的数据框,按“产品”分组。我想计算每个产品在“计数”列中的评论数。分组时,将有一列计算“分数”的平均值。还将有一个列,

我在Pandas中有一个数据框架,其中包含一组产品评论,这些产品与一些评论网站的产品略有不同。每次评审都与一个产品相关,并带有一个数字分数。评论也有一个文本字段,包含每个评论的文本(相当长的字段),以及它所来自的源站点的名称。 例如

我想将每个产品组合在一个新表中,以便分析每个产品是如何被评审的。我将最终执行文本分析(词性标记等),以了解每个产品是如何被审查的

我想首先创建一个新的数据框,按“产品”分组。我想计算每个产品在“计数”列中的评论数。分组时,将有一列计算“分数”的平均值。还将有一个列,其中组合了每个产品的文本字段,以便可以将审查文本作为一个整体进行分析,而不是单独进行分析。 例如

“source”列在这个特定的分析中不是必需的,但我包含它只是为了表明数据框架中还有其他列

从这一点上,我可以更容易地分解每个产品的文本,而不是单独的评论

提前谢谢

您可以使用:

编辑:

输出中含有
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)]]