Все, что я успешно написал, понимает список, который проверяет символы без 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
который не работает. Я знаю, что я близко, но у меня все еще возникают проблемы с пониманием
Вам не нужно использовать понимание списка, вы можете напрямую использовать 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
В качестве комментария к комментариям:
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()
.