Цикл по строкам данных в pandas и сравнение значений по столбцам - PullRequest
0 голосов
/ 16 октября 2018

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

У меня есть массив [m, n], где m - имена игроков (0-9), а n - годы (AE).Я пометил каждую строку цифрой «1», обозначающей, был ли этот игрок взят в предыдущую командную игру («0», если это не так).Я хотел бы создать несколько групп / классов, учитывая это.

  A B C D E
0 1 0 0 1 0
1 1 0 1 0 0
2 0 0 1 1 1
3 1 1 1 1 1
4 0 1 1 0 0
5 0 1 1 1 0
6 1 1 0 1 1
7 0 0 0 0 1
8 1 0 1 1 0
9 1 1 0 1 1

Некоторые изменения в классах: 1. Впервые в команде (а) 2. Все еще в теме и был в течение последних лет (б) 3. Все еще в команде, но включен и выключен (c) 4. Не в команде, но был там раньше (d) 5. Никогда не добирался до команды (e)

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

Например, вот пример кода для класса a:

class_a=[]
for (i, row) in test.iterrows():
    if (test.iloc[i, -1]==1):
        if (test.iloc[i, 0:-2].sum(axis=0))==0:
            class_a.append('Yes')

Однако пример кода для класса b немного сложнее:

test1=[]
count=0

for (i, row) in test.iterrows():
    row = test.iloc[i, 0:-1]
    for j in range(0, len(row)-1):
        if row[j]>=row[j+1]:
            print(i, row[j], row[j+1], 'Yes')
            count+=1
print(count)

Когда я печатаю результат i, строки [j] и строки [j + 1], я получаю следующие значения, которые не могут быть правильными.Я делаю вывод, что целочисленное значение строк не является правильным, так как мне не хватает индекса по строкам (значение j).Кажется, что счет в порядке (хотя подсчитывает не то):

0 1 0 Yes
0 0 0 Yes
1 1 0 Yes
1 1 0 Yes
2 0 0 Yes
2 1 1 Yes
3 1 1 Yes
3 1 1 Yes
3 1 1 Yes
4 1 1 Yes
4 1 0 Yes
5 1 1 Yes
5 1 1 Yes
6 1 1 Yes
6 1 0 Yes
7 0 0 Yes
7 0 0 Yes
7 0 0 Yes
8 1 0 Yes
8 1 1 Yes
9 1 1 Yes
9 1 0 Yes
22

Любая помощь и указатели очень ценятся.Я думал об использовании массивов, но это сложно, так как значение находится в каждой строке, а не в столбцах.Я не так думаю?Большое спасибо!

1 Ответ

0 голосов
/ 16 октября 2018

Один из способов сделать это - использовать pandas DataFrame.apply.Для каждой группы Вы начинаете с создания функции, которая сообщает вам, находится ли игрок в группе или нет на основании его истории, а затем вы применяете эту функцию для каждого ряда.Например, для вашего первого примера вы можете определить:

def first_time_in_team(series):
    return( (series.iloc[:-1].max()==0) and (series.iloc[-1]==1))

Эта функция возвращает True, если игрок не был в команде до этого года и в команде в этом году, и false в другом случае.Затем вы должны сделать:

group_first_time = df.apply(first_time_in_team,axis = 1)

, где df - это массив данных, содержащий ваш массив.Это даст вам серию с индексом список игрока и столбец со значением True, если игрок if является группой, и false в противном случае.Затем вы можете адаптировать первую функцию для соответствия каждой группе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...