【问题标题】:Pandas - Counting rows in a df to discover the survival rate each dayPandas - 计算 df 中的行数以发现每天的存活率
【发布时间】:2019-06-24 13:18:32
【问题描述】:

大家好!

我有一个 dfA(表 A),其中包含某些产品可用的天数 (days_survived)。我需要计算每天总共可用的产品数量(表 B)。我的意思是,我需要计算 dfA 中的行数,以发现前 5 天每天的存活率 (df2)。

表 A:

+-------+--------------+
| id    | days_survived|
+-------+--------------+
| 1     |  1           |
| 2     |  3           |
| 3     |  10          | 
| 4     |  40          |
| 5     |  4           |
| 6     |  9           |
+-------+--------------+

表 B(分析前 5 天的预期结果):

+-------+----------------+
| day   | #count_survived|
+-------+----------------+
| 1     |  6             |
| 2     |  5             |
| 3     |  5             | 
| 4     |  4             |
| 5     |  3             |
+-------+----------------+

这个结果意味着第一天总共有 6 个产品,然后第二天和第三天只有 5 个,然后第四天只有 4 个,最后第五天只有 3 个。

代码:

# create df
import pandas as pd
d = {'id': [1,2,3,4,5,6], 'days_survived': [1,3,10,40,4,9]}
dfA = pd.DataFrame(data=d) 

有人可以帮帮我吗? :)

【问题讨论】:

    标签: python pandas pandas-groupby sklearn-pandas


    【解决方案1】:

    使用带有展平和过滤的列表推导然后计数:

    comp = [y for x in dfA['days_survived'] for y in range(1, x + 1) if y < 6]
    s = pd.Series(comp).value_counts().rename_axis('day').reset_index(name='#count_survived')
    print (s)
       day  #count_survived
    0    1                6
    1    3                5
    2    2                5
    3    4                4
    4    5                3
    

    Counter 的另一个解决方案:

    from collections import Counter
    
    comp = [y for x in dfA['days_survived'] for y in range(1, x + 1) if y < 6]
    d = Counter(comp)
    df = pd.DataFrame({'day':list(d.keys()), '#count_survived':list(d.values())})
    

    【讨论】:

    • 你摇滚!再次感谢您的帮助! :)
    【解决方案2】:

    这是使用集合,创建一个项目出现的所有日期的列表,然后从列表中计算每天出现的次数

    import pandas as pd
    import numpy as np
    from collections import Counter
    
    df = pd.DataFrame(data={'id': [1,2,3,4,5,6], 'days_survived': [1,3,10,40,4,9]})
    # We will create a new column having values as a list of all the days for which item was present
    df['Days'] = df.apply(lambda a :  list(np.arange(1,a.days_survived+1)),axis=1)
    # Applyin Counter to the flattened list of all elements in 'Days' column
    cnt= Counter([item for items in list(df['Days']) for item in items])
    #Converting cnt Counter object to Dataframe
    df_new = pd.DataFrame(data= {'Days':list(cnt.keys()),'count':list(cnt.values())})
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 2022-10-13
      • 2021-06-25
      相关资源
      最近更新 更多