Pandas манипулирование фреймами данных и обработка исключений - PullRequest
0 голосов
/ 07 апреля 2020

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

df = df/100

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

    for (lambda x in df.columns):
        if x.type != "str":
           df[x] = df[x]/100 

Мне, вероятно, нужно добавить al oop для строк и использовать df.ilo c или что-то еще, но на самом деле я не уверен, что лучший способ сделать это но я уверен, что есть какой-то милый способ доступа к этой информации.

Ответы [ 3 ]

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

Ваше описание «ничего не делать» было довольно расплывчатым: вы хотите сохранить первоначальное значение или обозначить их как NA? Кроме того, каждый столбец имеет один тип данных или смешанные типы?

Вот одно из решений:

# Mock data
df = pd.DataFrame({
    'col1': [1, 'Two', 3, 'Four'],
    'col2': ['Five', 6, 'Seven', 8]
})

# Try converting every column to numeric before the division
# If the operation cannot be carried out, assign NaN
tmp = df.apply(pd.to_numeric, errors='coerce')  / 100

# Replace NaN cells with the original values from df
result = tmp.where(tmp.notnull(), df)
0 голосов
/ 07 апреля 2020

Используйте оператор try / исключением. Это позволяет вам что-то делать, если не возникнет ошибка, а затем указать, что делать в этом случае. Например:

for col in df.columns):
     try:
          df[x] = df[x]/100
     except TypeError:
          pass
0 голосов
/ 07 апреля 2020

У вас может быть функция для работы с каждой ячейкой в ​​строке:

def f(*row): 
    to_return = [] 
    for cell in row: 
        try: 
            to_return.append(cell / 100) 
        except TypeError: 
             to_return.append(cell) 
    return to_return 

Затем, чтобы применить эту функцию к каждой строке:

new_df = pd.DataFrame([f(*row) for row in 
                       df[[col for col in df.columns]].values],
                      columns=df.columns)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...