Как рассчитывать на нескольких уровнях в pandas данных? - PullRequest
1 голос
/ 05 апреля 2020

Извините за невозможность предоставить код. Я решил эту проблему в SAS, теперь я хочу сделать то же самое в Python.

. В следующем кадре данных есть несколько последовательных нулей:

Date        Time      Ask       Bid       Day     Price     Return

xxx         xxx       xxx       xxx       Mon     xxx       xxxx
xxx         xxx       xxx       xxx       Mon     xxx       0
xxx         xxx       xxx       xxx       Mon     xxx       0
xxx         xxx       xxx       xxx       Mon     xxx       xxxx
xxx         xxx       xxx       xxx       Mon     xxx       xxxx
xxx         xxx       xxx       xxx       Mon     xxx       0
xxx         xxx       xxx       xxx       Mon     xxx       0
xxx         xxx       xxx       xxx       Mon     xxx       0
xxx         xxx       xxx       xxx       Tue     xxx       0
xxx         xxx       xxx       xxx       Tue     xxx       0
xxx         xxx       xxx       xxx       Tue     xxx       0
xxx         xxx       xxx       xxx       Tue     xxx       xxxx
xxx         xxx       xxx       xxx       Tue     xxx       xxxx
xxx         xxx       xxx       xxx       Tue     xxx       0
xxx         xxx       xxx       xxx       Tue     xxx       xxxx
xxx         xxx       xxx       xxx       Tue     xxx       0
xxx         xxx       xxx       xxx       Wed     xxx       xxxx
xxx         xxx       xxx       xxx       Wed     xxx       0
xxx         xxx       xxx       xxx       Wed     xxx       0
xxx         xxx       xxx       xxx       Wed     xxx       xxxx
xxx         xxx       xxx       xxx       Wed     xxx       xxxx
xxx         xxx       xxx       xxx       Wed     xxx       0
xxx         xxx       xxx       xxx       Wed     xxx       0
xxx         xxx       xxx       xxx       Wed     xxx       0
xxx         xxx       xxx       xxx       Wed     xxx       xxxx
xxx         xxx       xxx       xxx       Wed     xxx       xxxx
xxx         xxx       xxx       xxx       Wed     xxx       xxxx
xxx         xxx       xxx       xxx       Wed     xxx       xxxx

Я хотел бы знать, сколько инцидентов последовательных нулей в каждый день, и сколько нулей в каждом инциденте есть на каждый день. Например, если мы посмотрим на среду, мы увидим, что есть 2 случая последовательных нулей: в 1-м - 2 нуля, а во 2 - 3. Во вторник есть только один случай последовательных нулей с 3 нулями. .

Итак, я хотел бы получить вывод, подобный следующему:

Day  Incident   Count_0

Mon    1          2
Mon    2          3
Tue    1          3
Wed    1          2
Wed    2          3

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 05 апреля 2020

Идея состоит в том, чтобы установить столбец в виде строки и создать инциденты с пониманием списка.

x=np.where(df['Return']=="0",'1','0')
df['Incident']=pd.DataFrame({"column1":[['xxxx'] if j=='' else [str(i)]*len(j) for i,j in enumerate(re.findall(r'(1*)', ''.join(x)))]}).explode('column1').fillna('xxxx').reset_index()['column1']
final=df.query("group!='xxxx'").groupby(["Day",'Incident']).count()[["Return"]]
final=final.query("Return!=1").reset_index()
final.assign(Incident=final.groupby('Day').cumcount()+1)


   Day  Incident  Return
0  Mon         1       2
1  Mon         2       3
2  Tue         1       3
3  Wed         1       2
4  Wed         2       3
1 голос
/ 05 апреля 2020

Вы можете попробовать:

import pandas as pd
from itertools import groupby

df = pd.DataFrame({'date': ['06-04-2020', '06-04-2020', '06-04-2020', '06-04-2020', '07-04-2020', '07-04-2020', '08-04-2020'],
                   'day': ['Mon', 'Mon', 'Mon', 'Mon', 'Tue', 'Tue', 'Wed'],
                   'value': [0, 0, 1, 0, 2, 0, 3]})
print(df)

result = []
for grp in df.groupby(by=['date', 'day']):
    grp_counts = [(i, len(list(j))) for i, j in groupby(list(grp[1]['value']))]
    for a, b in enumerate([x[1] for x in grp_counts if x[0]==0]):
        result.append([grp[0][0], grp[0][1], a+1, b])

print(pd.DataFrame(result, columns=['date', 'day', 'seq', 'count']))

Фрейм данных:

         date  day  value
0  06-04-2020  Mon      0
1  06-04-2020  Mon      0
2  06-04-2020  Mon      1
3  06-04-2020  Mon      0
4  07-04-2020  Tue      2
5  07-04-2020  Tue      0
6  08-04-2020  Wed      3

Результат:

         date  day  seq  count
0  06-04-2020  Mon    1      2
1  06-04-2020  Mon    2      1
2  07-04-2020  Tue    1      1
1 голос
/ 05 апреля 2020

Использование:

#filter 0 values - if strings use '0'
mask = df['Return'].eq(0)
#consecutive groups for 0
g1 = df['Return'].ne(df['Return'].shift()).cumsum()
#consecutive groups for Days
g2 = df['Day'].ne(df['Day'].shift()).cumsum()
#filter by 0 rows and aggregate counts
df1 = (g2[mask].groupby([g1, df['Day']])
               .size()
               .reset_index(level=0, drop=True)
               .reset_index(name='Count_0'))
#filter out unique rows (count == 1)
df1 = df1[df1['Count_0'].ne(1)].copy()
#Incidentcolumn by counter by new consecutive Days
g3 = df1['Day'].ne(df1['Day'].shift()).cumsum()
df1.insert(1, 'Incident', g3.groupby(g3).cumcount() + 1)
print (df1)
   Day  Incident  Count_0
0  Mon         1        2
1  Mon         2        3
2  Tue         1        3
5  Wed         1        2
6  Wed         2        3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...