Счетчик текущих значений в панде df - PullRequest
0 голосов
/ 29 августа 2018

У меня есть код, который counts количество значений в настоящее время. Он достигает этого, анализируя df, чтобы увидеть, не произойдут ли они снова.

Так что для df ниже я подсчитываю, сколько значений в настоящее время встречается в Col['Area'].

import pandas as pd

d = ({
    'Code' : ['A','A','B','A','B','B','A','B','A','A'],            
    'Area' : ['Home','Home','Shops','Park','Cafe','Shops','Home','Cafe','Work','Park'],  
     })

df = pd.DataFrame(data=d)

df['u'] = df[::-1].groupby('Area').Area.cumcount()

ids = [1]
seen = set([df.iloc[0].Area])
dec = False
for val, u in zip(df.Area[1:], df.u[1:]):
    ids.append(ids[-1] + (val not in seen) - dec)
    seen.add(val)
    dec = u == 0

df['On'] = ids

Проблема в том, что я хочу применить эту функцию только к значению 'A' в Col['Code'].

Я могу сделать следующее, но это сокращает мою df.

df = df[df.Code == 'A']

Я надеюсь произвести следующее;

  Code   Area  u On
0    A   Home  2  1
1    A   Home  1  1
2    B  Shops      
3    A   Park  1  2
4    B   Cafe      
5    B  Shops      
6    A   Home  0  2
7    B   Cafe      
8    A   Work  0  2
9    A   Park  0  2

Могу ли я изменить это, чтобы добавить ['Code']

df['u'] = df[::-1].groupby('Area').Area.cumcount() 

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я думаю, что нужно сначала отфильтровать по A значениям, применить решение и в последний раз добавить NaN для несоответствующих значений по reindex:

df1 = df[df.Code == 'A'].copy()

df1['u'] = df1[::-1].groupby('Area').Area.cumcount()

ids = [1]
seen = set([df1.iloc[0].Area])
dec = False
for val, u in zip(df1.Area[1:], df1.u[1:]):
    ids.append(ids[-1] + (val not in seen) - dec)
    seen.add(val)
    dec = u == 0

df1['On'] = ids

df1 = df1.reindex(df.index).fillna(df)
print (df1)
  Code   Area    u   On
0    A   Home  2.0  1.0
1    A   Home  1.0  1.0
2    B  Shops  NaN  NaN
3    A   Park  1.0  2.0
4    B   Cafe  NaN  NaN
5    B  Shops  NaN  NaN
6    A   Home  0.0  2.0
7    B   Cafe  NaN  NaN
8    A   Work  0.0  2.0
9    A   Park  0.0  1.0

Последнее возможно добавить fillna(''), но не рекомендуется, потому что получить смешанные значения - числовые со строками, а затем некоторые функции должны завершиться с ошибкой.

0 голосов
/ 29 августа 2018

Вы попробуйте этот код, чтобы получить желаемый выход

import pandas as pd

d = ({
'Code' : ['A','A','B','A','B','B','A','B','A','A'],            
'Area' : ['Home','Home','Shops','Park','Cafe','Shops','Home','Cafe','Work','Park'],  
 })

df = pd.DataFrame(data=d)

df1 = df[df.Code == 'A'].copy()

df1['u'] = df1[::-1].groupby('Area').Area.cumcount()

ids = [1]
seen = set([df1.iloc[0].Area])
dec = False
for val, u in zip(df1.Area[1:], df1.u[1:]):
    ids.append(ids[-1] + (val not in seen) - dec)
    seen.add(val)
    dec = u == 0
 df1['On'] = ids

 df1 = df1.reindex(df.index).fillna(df)
 print (df1.fillna(""))

 # Output
    Code  Area  u On
 0    A   Home  2  1
 1    A   Home  1  1
 2    B  Shops      
 3    A   Park  1  2
 4    B   Cafe      
 5    B  Shops      
 6    A   Home  0  2
 7    B   Cafe      
 8    A   Work  0  2
 9    A   Park  0  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...