计算多列的百分比
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 Interactions
、Likes
的 百分比, Shares
、Comments
、Love
和 Angry
这将导致具有以下结构的 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,可以生成问题中的情节。
我有一个具有以下结构的数据集
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 Interactions
、Likes
的 百分比, Shares
、Comments
、Love
和 Angry
这将导致具有以下结构的 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,可以生成问题中的情节。