我已经成功编写了一个列表解析,用于测试数据帧中列中的非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
哪个不起作用。 我知道我很接近,但我仍然无法理解理解
答案 0 :(得分: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
答案 1 :(得分:1)
作为评论的后续行动:
def clean(x):
try:
return x.encode('ascii', 'ignore').decode('ascii')
except AttributeError:
return x
dfAsc = dfAsc.applymap(clean)
lambda
是在.apply()
中定义转化的常用方法,但您也可以阅读def
is preferred for readability。
对于类型检查,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()
方法更改类型。