Определение, когда порядок набора столбцов изменяется в кадре данных панд - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть очень большой CSV-файл со следующей структурой:

  a1  b1  c1 a2 b2 c2 a3 b3 c3 ..... a999 b999 c999    
0 5   4   2  3  2  2  6  7  9  ....................
1 2   1   4  4  6  9  3  5  9  ....................
.
.

Что я хочу сделать, это сгруппировать столбцы в наборы по N, для a, b и c, и проверить, когда индексмаксимального значения (argmax) набора изменений в каждой строке.

Таким образом, в приведенном выше примере для N = 3 a1, b1, c1 - первый набор в строке 0, а argmax - 0, 2-й набор - a2, b2, c2, а argmax - все еще 0, 3-йset - это a3, b3, c3, но теперь argmax равно 2. Я действительно ищу скрипт, который анализирует весь CSV-файл и возвращает [c3, c1].c3, потому что именно там argmax изменяется в строке 0, а c1, потому что argmax не изменяется в строке 1, но c1 является наибольшим значением в этом наборе.

Я делаю это прямо сейчас, используя два цикла for и он медленный и выглядит очень некрасиво, есть ли лучший способ сделать это для pandas pythonic?Я чувствую, что должно быть.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я старался, чтобы код был максимально простым.Вы можете перевести ваш фрейм данных и группу по имени столбца с нарезкой:

df = df.T.reset_index()
idx = df.groupby(df['index'].str.slice(1,2)).idxmax()

Вывод:

       0  1
index      
1      0  2
2      3  5
3      8  8

Это означает, что для строки 0 максимум для группы 1 равен индексу 0,Максимальная группа 2 находится в индексе 3 (или 0, если вы берете мод 3), максимальная для группы 3 - в индексе 8 (или 2, если вы берете мод 3).То же самое для строки 1:)

Если вам нужно фактическое имя столбца:

df.columns[idx.values.flatten(order='F')]

Вывод:

['a1', 'a2', 'c3', 'c1', 'c2', 'c3']
0 голосов
/ 29 ноября 2018

Вы можете groupby наборов столбцов и использовать .idxmax, чтобы найти столбец, где максимум достигается в каждом наборе.Вы можете найти, где меняется первая буква (если она когда-либо изменилась), чтобы получить список

n = 3
df2 = df.groupby([x//n for x in range(len(df.columns))], axis=1).idxmax(1)

mask = df2.applymap(lambda x: x[0])  # Case of 1-letter column prefix
## If possibility of words with different length ending in digits try
# import string 
# mask = df2.applymap(lambda x: x.strip(string.digits))

df2.lookup(df2.index, 
           (mask.ne(mask.shift(-1, axis=1)).idxmax(1)+1) % (len(mask.columns))).tolist()

Пример данных

print(df)
   a1  b1  c1  a2  b2  c2  a3  b3  c3
0   5   4   2   3   2   2   6   7   9
1   2   1   4   4   6   9   3   5   9
2   2   1   4  10   6   9   3   5   9
3   2   1   4   1   6   9   3  10   9

n = 3
df2 = df.groupby([x//n for x in range(len(df.columns))], axis=1).idxmax(1)
print(df2)
#    0   1   2
#0  a1  a2  c3
#1  c1  c2  c3
#2  c1  a2  c3
#3  c1  c2  b3

mask = df2.applymap(lambda x: x[0])
df2.lookup(df2.index, (mask.ne(mask.shift(-1, axis=1)).idxmax(1)+1) % (len(mask.columns))).tolist()
#['c3', 'c1', 'a2', 'b3']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...