Использование понимания вложенного списка для проверки и изменения всех столбцов фрейма данных

1

Все, что я успешно написал, понимает список, который проверяет символы без ascii в столбце в кадре данных.

Я пытаюсь теперь написать описание, указанное в списке, для проверки всех столбцов в кадре данных.

Я исследовал это путем поиска вложенных блоков данных List Comprehensions и нескольких других вариантов, и, хотя они близки, я могу заставить их соответствовать моей проблеме.

Вот мой код:

import pandas as pd
import numpy as np

data = {'X1': ['A', 'B', 'C', 'D', 'E'], 
        'X2': ['meow', 'bark', 'moo', 'squeak', '120°']}

data2 = {'X1': ['A', 'B', 'F', 'D', 'E'], 
         'X3': ['cat', 'dog', 'frog', 'mouse', 'chick']}

df = pd.DataFrame(data)
df2 = pd.DataFrame(data2)

dfAsc = pd.merge(df, df2, how ='inner', on = 'X1')
dfAsc['X2']=[row.encode('ascii', 'ignore').decode('ascii') for row in 
    dfAsc['X2'] if type(row) is str]
dfAsc

который правильно возвращает:

X1  X2  X3
0   A   meow    cat
1   B   bark    dog
2   D   squeak  mouse
3   E   120 chick

Я попытался создать вложенное понимание, чтобы проверить все столбцы, а не только X2. Ниже приведена попытка создать новый df, содержащий ответ. Если это по-прежнему будет проблемой путаницы, я удалю его, поскольку это только одна из моих попыток получить ответ, не зацикливайтесь на нем, пожалуйста

df3 = pd.DataFrame([dfAsc.loc[idx]
                for idx in dfAsc.index
                [row.encode('ascii', 'ignore').decode('ascii') for row in 
                 dfAsc[idx] if type(row) is str]    
df3    

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

Теги:
dataframe
list-comprehension

2 ответа

1
Лучший ответ

Вам не нужно использовать понимание списка, вы можете напрямую использовать df.applymap. Это будет намного быстрее, чем использование понятий.

data = {'X1': ['A', 'B', 'C', 'D', 'E'], 
        'X2': ['meow', 'bark', 'moo', 'squeak', '120°']}

data2 = {'X1': ['A', 'B', 'F', 'D', 'E'], 
         'X3': ['cat', 'dog', 'frog', 'mouse', 'chick']}

df1 = pd.DataFrame(data, index=data['X1'], columns=['X2'])
df2 = pd.DataFrame(data2, index=data2['X1'], columns=['X3'])

dfAsc = pd.merge(df1, df2, how ='inner', left_index=True, right_index=True)

dfAsc = dfAsc.applymap(lambda x: x.encode('ascii', 'ignore').decode('ascii') if isinstance(x, str) else x)

>>> dfAsc

       X2     X3
A    meow    cat
B    bark    dog
D  squeak  mouse
E     120  chick
  • 0
    Вау, спасибо за это, но не все мои столбцы являются строками. Будет ли это работать без проверки типа?
  • 0
    В любом случае вы можете добавить возвращаемое значение в проверку состояния, если это строка. Редактировал код с условием
Показать ещё 7 комментариев
1

В качестве комментария к комментариям:

def clean(x):   
    try:
         return x.encode('ascii', 'ignore').decode('ascii') 
    except AttributeError:
         return x

dfAsc = dfAsc.applymap(clean)

lambda - это обычный способ определения вашего преобразования в .apply(), но вы также можете прочитать, что def является предпочтительным для удобочитаемости.

Что касается проверки типа, то все элементы в dfAsc представляют собой строки, в том числе "120 °" и более поздние 120:

dfAsc.applymap(lambda x: isinstance(x, str))
#Out[37]: 
#     X1    X2    X3
#0  True  True  True
#1  True  True  True
#2  True  True  True
#3  True  True  True

При импорте с pd.read_csv() тип может быть выбран столбцом. Если dfAsc. Некоторые dignostics могут быть сделаны с dfAsc.dtypes и сменой типа с .astype() метода .astype().

  • 1
    спасибо за это Евгений

Ещё вопросы

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