使用嵌套列表理解来检查&更改数据框的所有列

时间:2018-06-19 04:47:27

标签: python dataframe list-comprehension

我已经成功编写了一个列表解析,用于测试数据帧中列中的非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    

哪个不起作用。 我知道我很接近,但我仍然无法理解理解

2 个答案:

答案 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()方法更改类型。