Замените значения в одном столбце другим столбцом в кадре данных pandas [duplicate]

Вы можете преобразовать данные изображения в список Python (или список списков) следующим образом:

from PIL import Image

img = Image.open('eggs.png').convert('L')  # convert image to 8-bit grayscale
WIDTH, HEIGHT = img.size

data = list(img.getdata()) # convert image data to a list of integers
# convert that to 2D list (list of lists of integers)
data = [data[offset:offset+WIDTH] for offset in range(0, WIDTH*HEIGHT, WIDTH)]

# At this point the image's pixels are all in memory and can be accessed
# individually using data[row][col].

# For example:
for row in data:
    print(' '.join('{:3}'.format(value) for value in row))

# Here's another more compact representation.
chars = '@%#*+=-:. '  # Change as desired.
scale = (len(chars)-1)/255.
print()
for row in data:
    print(' '.join(chars[int(value*scale)] for value in row))

Вот увеличенная версия небольшого 24x24 RGB eggs.png изображение, которое я использовал для тестирования:

Вот результат первого примера доступа:

И здесь вывод из второго примера:

@ @ % * @ @ @ @ % - . * @ @ @ @ @ @ @ @ @ @ @ @
@ @ .   . + @ # .     = @ @ @ @ @ @ @ @ @ @ @ @
@ *             . .   * @ @ @ @ @ @ @ @ @ @ @ @
@ #     . .   . .     + % % @ @ @ @ # = @ @ @ @
@ %       . : - - - :       % @ % :     # @ @ @
@ #     . = = - - - = - . . = =         % @ @ @
@ =     - = : - - : - = . .     . : .   % @ @ @
%     . = - - - - : - = .   . - = = =   - @ @ @
=   .   - = - : : = + - : . - = - : - =   : * %
-   .   . - = + = - .   . - = : - - - = .     -
=   . : : . - - .       : = - - - - - = .   . %
%   : : .     . : - - . : = - - - : = :     # @
@ # :   .   . = = - - = . = + - - = - .   . @ @
@ @ #     . - = : - : = - . - = = : . .     # @
@ @ %     : = - - - : = -     : -   . . .   - @
@ @ *     : = : - - - = .   . - .   .     . + @
@ #       . = - : - = :     : :   .   - % @ @ @
*     . . . : = = - : . .   - .     - @ @ @ @ @
*   . .       . : .   . .   - = . = @ @ @ @ @ @
@ :     - -       . . . .     # @ @ @ @ @ @ @ @
@ @ = # @ @ *     . .     . - @ @ @ @ @ @ @ @ @
@ @ @ @ @ @ @ .   .   . # @ @ @ @ @ @ @ @ @ @ @
@ @ @ @ @ @ @ -     . % @ @ @ @ @ @ @ @ @ @ @ @
@ @ @ @ @ @ @ # . : % @ @ @ @ @ @ @ @ @ @ @ @ @

Доступ к данным пикселя теперь должен быть быстрее, чем использование возвращаемых объектов img.load() (и значения будут целыми числами в диапазоне 0..255).

25
задан piRSquared 5 January 2017 в 00:05
поделиться

3 ответа

Вероятно, вы хотите сделать

df['Normalized'] = np.where(df['Currency'] == '$', df['Budget'] * 0.78125, df['Budget'])
49
ответ дан Wes McKinney 18 August 2018 в 11:26
поделиться
  • 1
    Можно ли сделать что-то подобное, но вместо слов вместо слов? – jake wong 20 August 2016 в 03:05

Принимая предложение Тома Кимбера еще на один шаг, вы можете использовать словарь функций, чтобы установить различные условия для ваших функций. Это решение расширяет сферу вопроса.

Я использую пример из личного приложения.

# write the dictionary

def applyCalculateSpend (df_name, cost_method_col, metric_col, rate_col, total_planned_col):
    calculations = {
            'CPMV'  : df_name[metric_col] / 1000 * df_name[rate_col],
            'Free'  : 0
            }
    df_method = df_name[cost_method_col]
    return calculations.get(df_method, "not in dict")

# call the function inside a lambda

test_df['spend'] = test_df.apply(lambda row: applyCalculateSpend(
row,
cost_method_col='cost method',
metric_col='metric',
rate_col='rate',
total_planned_col='total planned'), axis = 1)

  cost method  metric  rate  total planned  spend
0        CPMV    2000   100           1000  200.0
1        CPMV    4000   100           1000  400.0
4        Free       1     2              3    0.0
1
ответ дан Artem Yevtushenko 18 August 2018 в 11:26
поделиться

Аналогичные результаты с помощью альтернативного стиля могут заключаться в том, чтобы написать функцию, которая выполняет операцию, которую вы хотите в строке, используя синтаксис row['fieldname'] для доступа к отдельным значениям / столбцам, а затем выполнить DataFrame.apply на нем

Это повторяет ответ на вопрос, связанный здесь: pandas создает новый столбец на основе значений из других столбцов

def normalise_row(row):
    if row['Currency'] == '$'
    ...
    ...
    ...
    return result

df['Normalized'] = df.apply(lambda row : normalise_row, axis=1) 
5
ответ дан Community 18 August 2018 в 11:26
поделиться
  • 1
    Должно ли быть lambda row:normalise_row(row)? И вы не могли бы заменить все это всего лишь на normalise_row? – Teepeemm 22 June 2018 в 20:18
Другие вопросы по тегам:

Похожие вопросы: