【问题标题】:Python - Building dataframe for plotPython - 为绘图构建数据框
【发布时间】:2023-03-26 22:20:01
【问题描述】:

下面是一个代码 sn-p,它会得到一个从这里解压缩的 csv:https://github.com/sstangl/openpowerlifting-static/raw/gh-pages/openpowerlifting-latest.zip 到我的 JupyterLab。我正在尝试绘制从 1974 年到 2019 年每年的所有性别比例。我是 python 新手,不明白如何使用 get_gender_ratios 方法构建数据框,以便我有 2 行(男性,女性)和列将是显示每个男性和女性的比率的年份。有些年份只有男性,大多数都有。我知道我需要对数据框进行某种连接,但无法弄清楚构建它的语法。我在下面有一个 while 循环,它显示了如何使用该方法获取性别比例,但将该信息存储到数据框中是我的问题。一旦我建立了新的数据框,我想转置数据,这样我就可以做一个图来看看这些年来性别比例是如何变化的。不确定如何转置它。我知道如何绘制数据框,但从这种方法构建数据框是我卡住的地方。我已经完成了所有的研究来尝试看看我如何构建它并且没有任何运气。任何帮助表示赞赏。下面是代码 sn-p。

import pandas as pd

df = pd.read_csv("./openpowerlifting-2019-11-20/openpowerlifting-2019-11-20.csv", low_memory=False)

def get_gender_ratios(df,year):
   return df.query('Date>"{}-01-01" & Date<"{}-01-01"'.format(year, year+1)).loc[:, 
   ['Sex']].squeeze().value_counts() \
   / df.query('Date>"{}-01-01" & Date<"{}-01-01"'.format(year, year+1)).loc[:,['Sex']].shape[0]


count = 1974
while (count < 2019):
   print(count)
   print(get_gender_ratios(df,count))
   count = count + 1

【问题讨论】:

  • 好吧,你试过什么?您是否进行过任何研究,阅读过任何指南或文档?
  • 我宁愿创建只有年份的列并将其与groupby("Year")groupby("Year", "Sex") 一起使用,然后计算每个年份。它应该在一个数据框中给出结果。
  • @AlexanderCécile - 还有什么要研究的?我提供了显示我尝试过的代码。
  • Groupby 可能会有所帮助:pandas.pydata.org/pandas-docs/stable/reference/api/… 和 seaborn 非常适合绘制分类数据,其中数据框中的列指示类别:seaborn.pydata.org

标签: python pandas dataframe matplotlib


【解决方案1】:

首先您可以使用Year 创建列,然后更容易过滤或分组行

df['Year'] = df['Date'].str[:4]

首先我在考虑按YearSex 分组来计算项目数

groups = df.groupby(['Year', 'Sex'])

df2 = pd.DataFrame()

df2['Count'] = groups['Sex'].count()
df2 = df2.reset_index()

print(df2.head(20))

但是当没有Females 时它不会创建行,我认为添加这些行需要更多的工作。

所以我按Year 分组,并在每个组中过滤MaleFemale 以计算它们

groups = df.groupby(['Year'])

df2 = pd.DataFrame(columns=['Year', 'Sex', 'Count', 'Ratio'])

for year, data in groups:
    M = len(data[ data['Sex'] == 'M' ])
    F = len(data[ data['Sex'] == 'F' ])

    df2 = df2.append([
        {'Year': year, 'Sex': 'M', 'Count': M, 'Ratio': M/(F+M)},
        {'Year': year, 'Sex': 'F', 'Count': F, 'Ratio': F/(F+M)}
    ], ignore_index=True)

print(df2.head(20))

这样我在没有Females的时候得到零

    Year Sex Count  Ratio
0   1964   M    21    1.0
1   1964   F     0    0.0
2   1965   M    45    1.0
3   1965   F     0    0.0
4   1966   M    71    1.0
5   1966   F     0    0.0
6   1967   M    72    1.0
7   1967   F     0    0.0
8   1968   M    80    1.0
9   1968   F     0    0.0
10  1969   M    57    1.0
11  1969   F     0    0.0
12  1970   M    94    1.0
13  1970   F     0    0.0
14  1971   M   151    1.0
15  1971   F     0    0.0
16  1972   M   211    1.0
17  1972   F     0    0.0
18  1973   M   143    1.0
19  1973   F     0    0.0

更多问题我不得不在一个情节上绘制MalesFemales

ax = plt.gca()
df2[ df2['Sex'] == 'M' ].plot('Year', 'Ratio', kind='bar', label='M', color='red',  ax=ax, position=0)
df2[ df2['Sex'] == 'F' ].plot('Year', 'Ratio', kind='bar', label='F', color='green', ax=ax, position=1)
plt.show()

也许你会找到更好的方法来做到这一点。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('openpowerlifting-2019-11-20.csv', low_memory=False) # ,headers=None, sep=';'
df['Year'] = df['Date'].str[:4]

groups = df.groupby(['Year'])

df2 = pd.DataFrame(columns=['Year', 'Sex', 'Count', 'Ratio'])
for year, data in groups:
    M = len(data[ data['Sex'] == 'M' ])
    F = len(data[ data['Sex'] == 'F' ])

    df2 = df2.append([
        {'Year': year, 'Sex': 'M', 'Count': M, 'Ratio': M/(F+M)},
        {'Year': year, 'Sex': 'F', 'Count': F, 'Ratio': F/(F+M)}
    ], ignore_index=True)

print(df2.head(20))

ax = plt.gca()
df2[ df2['Sex'] == 'M' ].plot('Year', 'Ratio', kind='bar', label='M', color='red',  ax=ax, position=0)
df2[ df2['Sex'] == 'F' ].plot('Year', 'Ratio', kind='bar', label='F', color='green', ax=ax, position=1)
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多