计算多列的百分比

Calculating percentages for multiple columns

我有一个具有以下结构的数据集

index candidato Page Name Post Created Date Total Interactions Likes Shares Comments Love Angry
0 António Costa Observador 2022-01-03 4500 340 400 433 545 565

有9个不同的candidato(候选人)和27个不同的Page Name

可以找到完整的数据集here

我需要找到一种方法来计算每个 Page Name 的总数和 Total InteractionsLikes百分比SharesCommentsLoveAngry 这将导致具有以下结构的 DataFrame

candidato Page Name Total Interactions Total Interactions Percentage Total Likes Total Likes Percentage Other Columns Other Columns Percentage
António Costa Observador 6500 34 23 1% 540 23%
Rui Rio Observador 4500 23 value percentage value percentage

我需要计算这个的原因是为了生成一个 百分比堆积条形图,例如这个:

使用 Pandas 实现此目的的最佳方法是什么? 在此先感谢您的帮助。

披露 这个问题是为了帮助一个非营利项目,该项目分析媒体对 2022 年大选的葡萄牙候选人的行为和偏见。 prior report 是使用 Google 表格制作的,但使用 Python 分析数据集是最好的方法,因为我计划每 3 个月执行一次。

可以找到 GitHub 存储库 here,您可以在其中访问所有数据集和使用的代码。

通过以下方式获取数据后:

!wget https://raw.githubusercontent.com/JorgeMiguelGomes/LEG2022_MediaMonitor/main/legislativas_2022_media_monitor_29jan2022/data_products/legislativas_2022_all_candidates_filtered.csv

并将 csv 读入数据框:

df = pd.read_csv("legislativas_2022_all_candidates_filtered.csv")
df = df.drop(columns=["Unnamed: 0"])

您可以按页面名称分组并对您提到的列中的值求和:

col_list = ["Total Interactions","Likes","Shares","Comments","Love","Angry"]
totals = df.groupby("Page Name")[col_list].sum()

前 3 行如下所示:

              Total Interactions  Likes  Shares  Comments  Love  Angry
Page Name                                                             
Agência Lusa                4048   1464     285      1011    79    127
CM TV                      21813   7934    1050      7824   401    627
CNN Portugal              216437  59776    8755    107879  3640   5198

要获得百分比,您可以这样做:

percentages = totals/df[col_list].sum()*100

结果样本:

              Total Interactions      Likes  ...       Love      Angry
Page Name                                    ...                      
Agência Lusa            0.324301   0.403282  ...   0.408945   0.371085
CM TV                   1.747521   2.185548  ...   2.075784   1.832048
CNN Portugal           17.339582  16.466265  ...  18.842530  15.188172

你可以 groupby 'Page Name' 和 'candidato' 然后求 'Total Interactions','Likes','Comments','Shares','Love','Angry' 每个页面名称和每个候选人:totals.

然后通过第一个索引级别(即“页面名称”)在 totals 上使用 groupby 并转换 sum 函数,以便获得为 [=12 转换的每个页面名称的总和=] 并用它除以 totals 得到百分比。

最后 join 最终结果的两个 DataFrame。

totals = df.groupby(['Page Name','candidato'])[['Total Interactions','Likes','Comments','Shares','Love','Angry']].sum()
percentages = totals.groupby(level=0).transform('sum').rdiv(totals).mul(100).round(2)

out = totals.join(percentages, lsuffix='', rsuffix='_Percentages').reset_index()

这会生成一个 DataFrame,可以生成问题中的情节。