Python 使用嵌套列表理解检查&;更改数据帧的所有列

Python 使用嵌套列表理解检查&;更改数据帧的所有列,python,dataframe,list-comprehension,Python,Dataframe,List Comprehension,我已经成功地编写了一个列表理解,它可以测试数据帧中列中的非ascii字符 我现在试图编写一个嵌套列表来检查数据框中的所有列 我已经通过搜索嵌套列表理解数据帧和其他几个变体对此进行了研究,虽然它们很接近,但我可以让它们适合我的问题 这是我的密码: import pandas as pd import numpy as np data = {'X1': ['A', 'B', 'C', 'D', 'E'], 'X2': ['meow', 'bark', 'moo', 'squeak

我已经成功地编写了一个列表理解,它可以测试数据帧中列中的非ascii字符

我现在试图编写一个嵌套列表来检查数据框中的所有列

我已经通过搜索嵌套列表理解数据帧和其他几个变体对此进行了研究,虽然它们很接近,但我可以让它们适合我的问题

这是我的密码:

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    
这是行不通的。
我知道我的理解能力很强,但我仍然难以理解理解力

你不需要使用列表理解,你可以直接使用 这将比使用理解快得多

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\u csv()
导入时,可按列选择类型。如果
dfAsc。一些诊断可以使用
dfAsc.dtypes
完成,也可以使用
.astype()
方法更改类型

您需要使用
.apply()
,并在其中包含一个函数,否则您将试图创建一个列表。请查看您对
df3=pd.DataFrame(…)
的期望值?请补充上述问题,了解预期的
df3
很重要too@EvgenyPogrebnyak-如果我可以更改一列,为什么我不能用嵌套的CL来更改所有列?你可以这样做,但是你试图手动按索引进行操作,从而失去了数据帧的好处。下面是@Amey Dahale的一个很好的例子。哇,谢谢你,但不是我所有的列都是字符串,这在不测试类型的情况下还能工作吗?你可以用条件检查返回值是否是字符串作为前缀。使用条件编辑代码通常
isinstance(s,str)
优于
=
类型检查也用于学习目的:您可以在表达式之前使用
def
定义函数,而不一定是
lambda
@MickHawkes如果答案最符合您的目的,您可以接受答案