Многоформатное форматирование на Pandas DF - PullRequest
2 голосов
/ 17 апреля 2020

У меня есть фрейм данных, похожий на этот:

    x   y   z
0   1   0   10
1   1   10  400
2   1   10  95

Чтобы воспроизвести фрейм данных, используйте следующий код.

import pandas as pd
df = {'x': [1,1,10], 'y': [0,10,10], 'z': [10,400,95]}
df = pd.DataFrame(df, columns = ['x', 'y', 'z'])

Пробелы заполнены 0, следовательно, все ячейки имеют текущее значение.

Я хочу запустить / применить набор условий для этого DF, такой что:

  1. Если столбец Y имеет значение == 0, то замените значение на «red: 0»
  2. Если столбец Z имеет значение> 300, то замените значение на «red: {value} '
  3. Если столбец Z имеет значение> 90, то замените значение на' yellow: {value} '

В основном я пытаюсь преобразовать DF в вики-таблицу с некоторым условным форматированием цвета. После форматирования это должно выглядеть так:

|=x|=y|=z
|1|'red: 0'|10
|1|10|'red: 400'
|1|10|'yellow: 95'

Есть ли чистый способ сделать это?

PS: есть два исходных источника данных, список словаря и вложенный словарь, который был преобразован в DF. Любая идея, если это легче сделать за пределами Pandas?

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете использовать Series.replace или numpy.where:

z = df.z.astype(str)
df.y = df.y.replace(0, 'red: 0')
df.z = np.where(df.z > 300, 'red: '+ z,
       np.where(df.z > 90, 'yellow: '+ z,df.z))
print (df)
   x       y           z
0  1  red: 0          10
1  1      10    red: 400
2  1      10  yellow: 95

Другое решение с numpy.select:

df.y = df.y.replace(0, 'red: 0')
z = df.z.astype(str)

m1 = df.z > 300
m2 = df.z > 90
df.z = np.select([m1, m2 & ~m1], ['red: ' + z, 'yellow: '+ z], default=df.z)
print (df)
   x       y           z
0  1  red: 0          10
1  1      10    red: 400
2  1      10  yellow: 95
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...