Совокупный счет между двумя столбцами в панде df - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь вернуть совокупное count количества раз, когда есть изменение значений в column.

Так что для df ниже, я хочу вернуть счетчиквремен, когда 'Home' меняется на 'Away' и наоборот.Я не хочу возвращать количество раз, когда отображается значение.

import pandas as pd

d = ({
    'Who' : ['Home','Away','','','Home','Away','Home','Home','Home','','Away','Home'],
    })

df = pd.DataFrame(data = d)

Я пробовал это.

df['Home_count'] = (df['Who'] == 'Home').cumsum()
df['Away_count'] = (df['Who'] == 'Away').cumsum()

Что возвращает:

     Who  Home_count  Away_count
0   Home           1           0
1   Away           1           1
2                  1           1
3                  1           1
4   Home           2           1
5   Away           2           2
6   Home           3           2
7   Home           4           2
8   Home           5           2
9                  5           2
10  Away           5           3
11  Home           6           3

Но я пытаюсь подсчитать, сколько раз оно меняется.Не общее количество каждого значения.Так что если там написано «Дом, Дом, Дом, В гостях», рядом с «В гостях» должен быть только счет.Не 1,2,3 против дома.

Home 1 #Theres a change so provide a count
Home   #No change so no count
Home   #No change so no count
Away 1 #Theres a change so provide a count
Home 2 #Theres a change so provide a count

Пожалуйста, обратитесь к предполагаемому выводу:

Предполагаемый вывод:

   Count_Away Count_Home   Who
0                      1  Home
1           1             Away
2                             
3                             
4                      2  Home
5           2             Away
6                      3  Home
7                         Home
8                         Home
9                             
10          3             Away
11                     4  Home

Ответы [ 3 ]

0 голосов
/ 26 июня 2018
  1. Используйте pd.get_dummies, чтобы получить DataFrame для однократных кодировок
  2. . Рассчитать совокупную сумму с помощью cumsum
  3. . Найти точки изменения, используя сравнение vс его сдвинутой версией
  4. Заполнить NaN пустой строкой
  5. Объединить результат с оригиналом

v = pd.get_dummies(
      df.where(df.Who.ne(df.Who.shift()) & df.Who.str.len().astype(bool)
   ), prefix='Count'
).cumsum()

df = pd.concat([
     v.where(v.ne(v.shift())).fillna('', downcast='infer'), df
  ], axis=1
)

print(df)
   Count_Away Count_Home   Who
0           0          1  Home
1           1             Away
2                             
3                             
4                      2  Home
5           2             Away
6                      3  Home
7                         Home
8                         Home
9                             
10          3             Away
11                     4  Home
0 голосов
/ 26 июня 2018

Вот метод, который будет подсчитывать изменения только при переходе с дома на выезд и наоборот.Он не будет увеличиваться, если между двумя одинаковыми типами есть пробел Who.

import pandas as pd
import numpy as np

whos = ['Home', 'Away']
for who in whos:
    # Find where `Who` is not consecutive based on index. Don't consider blank gaps
    # when determining changes. 
    s = df[df.replace('', np.NaN).fillna(method='ffill').Who==who].index.to_series().diff()!=1

    # Get the counts, align to original df based on index.
    df['Count_'+who] = s[s].cumsum()

    # Replace NaN with empty string to match your output
    df['Count_'+who] = df['Count_'+who].replace(np.NaN, '')

Вывод:

     Who Count_Home Count_Away
0   Home          1           
1   Away                     1
2                             
3                             
4   Home          2           
5   Away                     2
6   Home          3           
7   Home                      
8   Home                      
9                             
10  Away                     3
11  Home          4           
12                            
13  Home                      
0 голосов
/ 26 июня 2018

Показывает количество каждого слова Home & Away при каждом изменении его значения в обоих столбцах.

import pandas as pd

d = ({
    'Who' : ['Home','Away','','','Home','Away','Home','Home','Home','','Away','Home'],
    })
df = pd.DataFrame(data = d)



countaway=0
counthome=0
df['Count_Away']=0
df['Count_Home']=0

for index,rows in df.iterrows():    
    if(rows['Who']=='Home'):
        df['Count_Home'].values[index]=counthome+1
        counthome+=1
    else:
        df['Count_Home'].values[index]=0 
    if(rows['Who']=='Away'):
        df['Count_Away'].values[index]=countaway+1
        countaway+=1
    else:
        df['Count_Away'].values[index]=0

Вывод:

   Who  Count_Away  Count_Home
0   Home    0         1
1   Away    1         0
2           0         0
3           0         0
4   Home    0         2
5   Away    2         0
6   Home    0         3
7   Home    0         4
8   Home    0         5
9           0         0 
10  Away    3         0
11  Home    0         6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...