Создание строки из столбца панды и данных строки

1

Я заинтересован в создании строки, состоящей из данных строки и столбца pandas. Учитывая следующий кадр данных pandas, меня интересует только генерация строки из столбцов с положительными значениями

index    A    B    C
  1      0    1    2
  2      0    0    3
  3      0    0    0
  4      1    0    0

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

index    Positives
  1       B-1, C-2
  2       C-3
  4       A-1
Теги:
pandas

2 ответа

1

Вот один из способов использования pd.DataFrame.apply + pd.Series.apply:

df = pd.DataFrame([[1, 0, 1, 2], [2, 0, 0, 3], [3, 0, 0, 0], [4, 1, 0, 0]],
                  columns=['index', 'A', 'B', 'C'])

def formatter(x):
    x = x[x > 0]
    return (x.index[1:].astype(str) + '-' + x[1:].astype(str))

df['Positives'] = df.apply(formatter, axis=1).apply(', '.join)

print(df)

   index  A  B  C  Positives
0      1  0  1  2   B-1, C-2
1      2  0  0  3        C-3
2      3  0  0  0          
3      4  1  0  0        A-1

Если вам нужно отфильтровать строки нулевой длины, вы можете использовать тот факт, что пустые строки оцениваются False с помощью bool:

res = df[df['Positives'].astype(bool)]

print(res)

   index  A  B  C  Positives
0      1  0  1  2   B-1, C-2
1      2  0  0  3        C-3
3      4  1  0  0        A-1
  • 0
    Звучит хорошо, но возвращает ошибку.
  • 0
    @ user32185, нет, это не так. Я проверил это с данными OP. Вы можете уточнить?
Показать ещё 2 комментария
0

Я бы заменил нули np.NaN чтобы удалить вещи, которые вам не np.NaN и stack. Затем сформируйте groupby.apply(list) строки и groupby.apply(list)

import numpy as np

df = df.set_index('index') # if 'index' is not your index.

stacked = df.replace(0, np.NaN).stack().reset_index()
stacked['Positives'] = stacked['level_1'] + '-' + stacked[0].astype(int).astype('str')
stacked = stacked.groupby('index').Positives.apply(list).reset_index()

stacked теперь:

   index   Positives
0      1  [B-1, C-2]
1      2       [C-3]
2      4       [A-1]

Или, если вам просто нужна одна строка, а не список, измените последнюю строку:

stacked.groupby('index').Positives.apply(lambda x: ', '.join(list(x))).reset_index()
#   index Positives
#0      1  B-1, C-2
#1      2       C-3
#2      4       A-1
  • 0
    Привет, я просто пытался проработать ваш ответ. Не могли бы вы объяснить, какова цель 'level_1' во второй строке?
  • 0
    Когда вы складываете DataFrame он создает мультииндекс, с именами столбцов в качестве одного из уровней индекса. .reset_index() избавляется от multIndex, который оставляет столбец с именем level_1 котором указано имя столбца, из которого level_1 ненулевое значение. Другой столбец с меткой 0 содержит все ненулевые значения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню