Python 使用嵌套列表理解检查&;更改数据帧的所有列
我已经成功地编写了一个列表理解,它可以测试数据帧中列中的非ascii字符 我现在试图编写一个嵌套列表来检查数据框中的所有列 我已经通过搜索嵌套列表理解数据帧和其他几个变体对此进行了研究,虽然它们很接近,但我可以让它们适合我的问题 这是我的密码: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
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如果答案最符合您的目的,您可以接受答案