Pandas - подсчет строк в df для определения выживаемости каждый день - PullRequest
0 голосов
/ 31 января 2019

.

Здравствуйте, ребята!

У меня есть 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) 

Может кто-нибудь помочь мне, пожалуйста?:)

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Это использует Коллекции, создающие список всех вхождений дней, для которых присутствовал элемент, и затем подсчитывающее количество вхождений каждого дня из списка

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())})

Надеюсь, это поможет.

0 голосов
/ 31 января 2019

Используйте понимание списка с выравниванием и фильтрацией, а затем подсчитайте:

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())})
...