【问题标题】:Convert dataframe for category percentages in python在python中转换类别百分比的数据框
【发布时间】:2021-10-04 02:22:58
【问题描述】:

我想转换一个数据框,稍后在 python 中计算图表的百分比。

当前帧是这样的

Post ID Title Url Author Score Submission_Date Total_Num_of_Comments Permalink Flair Selftext TitleAndText Word Count
k4nllk Update: Whassup bro? https://www.reddit.com/r/GME/comments/k4nllk/update_whassup_bro/ matt_xndever 1 2021-01-01 16:58:48 13 /r/GME/comments/k4nllk/update_whassup_bro/ Hedge Fund Tears asdasdasd asdasdasdasd 59.0

flairs 是我想要寻找的类别(超过 40 个)。在一个提交日(我只想查看几天),可以有多个具有不同风格的帖子。这些天赋加起来应该是 100%。

所以我想创建一个这样的数据框:

Submission_Date Discussion Due Diligence Hedge Fund Tears News
01.01.2021 NaN NaN 1.0 NaN
03.01.2021 NaN 0.333333 0.666667 NaN

我的图表应该是这样的: Plot stacked (100%) bar chart for multiple categories on multiple dates in Python

有人可以帮我准备吗?

感谢和问候

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以按如下方式解决问题:

    • 迭代唯一日期并为每个日期切片数据框
    • 使用 pandas value_counts() 计算每个天赋类别的计数
    • 通过除以每个切片的大小来获得份额
    • 转置包含要附加的共享的 pandas 系列
    • 附加每个日期的份额

    这是一个示例输入:

    df = {
        'Submission_Date': ['2021-01-01', '2021-03-01', '2021-03-01', '2021-03-01', '2021-04-01', '2021-04-01'],
        'Flair': ['Hedge Fund Tears', 'Hedge Fund Tears', 'Hedge Fund Tears', 'Due Diligence', 'Discussion', 'News']
    }
    df = pd.DataFrame(df)
    df['Submission_Date'] = pd.to_datetime(df['Submission_Date'])
    display(df)
    

    这是一个示例实现:

    unique_flairs = list(df['Flair'].unique())
    flair_df = pd.DataFrame()
    
    # iterate over unique dates
    for date in df['Submission_Date'].unique():
        date_subset = df.loc[df['Submission_Date'] == date]
        # for flairs in each date, get counts of values
        counts = date_subset['Flair'].value_counts()
        # get shares
        shares = counts / len(date_subset)
        # transpose series for appending
        shares_df = pd.DataFrame(shares).transpose()
        shares_df['Submission_Date'] = date
        for flair in [x for x in unique_flairs if x not in shares_df.columns]:
            shares_df[flair] = np.nan
        # append shares per date
        flair_df = pd.concat([flair_df, shares_df])
        flair_df = flair_df.reset_index(drop=True)
    
    # rearrange columns
    flair_df = flair_df[['Submission_Date'] + unique_flairs]
    display(flair_df)
    

    输出:

    【讨论】:

      【解决方案2】:

      您可以使用数据透视表来实现此结果。我用一些随机值组成了输入数据框。

      data = pandas.DataFrame.from_dict({
          "Submission_Date": [
              datetime.date(2021, 1, 1),
              datetime.date(2021, 1, 1),
              datetime.date(2021, 1, 2),
              datetime.date(2021, 1, 2),
              datetime.date(2021, 1, 3),
              datetime.date(2021, 1, 3),
              datetime.date(2021, 1, 3),
              datetime.date(2021, 1, 4),
          ],
          "Flair": ["Discussion", "Due Diligence", "Due Diligence", "Discussion", "Discussion",  "Hedge Fund Tears", "News", "News"],
      })
      data["Flair1"] = data.Flair.values # copy to another column to assist pivot
      res = pandas.pivot_table(
          data,
          index=["Submission_Date"],
          values=['Flair'],
          columns=['Flair1'],
          aggfunc='count',
          fill_value=0
      
      )
      res = pandas.DataFrame(res.to_records())
      res.columns = [col.replace("('Flair', ", '').replace(")", '') for col in res.columns]
      res['Total'] = res.astype({col:float for col in res.columns if col != "Submission_Date"}).sum(numeric_only=True, axis=1) # find Total
      res[[col for col in res.columns if col != "Submission_Date"]] = res[[col for col in res.columns if col != "Submission_Date"]].div(res.Total, axis=0) # divide by Total
      res = res.drop(columns=['Total']) # drop Total
      print(res)
      

      【讨论】:

        猜你喜欢
        • 2019-05-02
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多