Python 熊猫dropna在寻找平均值方面没有按预期工作
当我运行下面的代码时,我得到了错误: TypeError:“非类型”对象没有属性“getitem”Python 熊猫dropna在寻找平均值方面没有按预期工作,python,pandas,Python,Pandas,当我运行下面的代码时,我得到了错误: TypeError:“非类型”对象没有属性“getitem” import pyarrow import pandas import pyarrow.parquet as pq df = pq.read_table("file.parquet").to_pandas() df = df.iloc[1:,:] df = df.dropna (how="any", inplace = True) # modif
import pyarrow
import pandas
import pyarrow.parquet as pq
df = pq.read_table("file.parquet").to_pandas()
df = df.iloc[1:,:]
df = df.dropna (how="any", inplace = True) # modifies it in place, creates new dataset without NAN
average_age = df["_c2"].mean()
print average_age
数据帧如下所示:
_c0 _c1 _c2
0 RecId Class Age
1 1 1st 29
2 2 1st NA
3 3 1st 30
如果我在调用dropna方法后打印df,我会得到“None”
它是否应该创建一个没有“NA”的新数据帧,这样我就可以在不抛出错误的情况下获得平均年龄?根据OP的评论,NA是一个字符串而不是NaN。所以
dropna()
在这里不好。过滤掉字符串值“NA”的许多可能选项之一是:
df = df[df["_c2"] != "NA"]
如@DJK在评论中所建议的,捕获不精确匹配的更好选项(例如,使用尾随空格):
df = df[~df["_c2"].str.contains('NA')]
此选项应删除所有字符串,而不仅仅是“NA”:
df = df[df[“_c2”].apply(lambda x: x.isnumeric())]
根据OP的评论,NA是一个字符串,而不是NaN。所以
dropna()
在这里不好。过滤掉字符串值“NA”的许多可能选项之一是:
df = df[df["_c2"] != "NA"]
如@DJK在评论中所建议的,捕获不精确匹配的更好选项(例如,使用尾随空格):
df = df[~df["_c2"].str.contains('NA')]
此选项应删除所有字符串,而不仅仅是“NA”:
df = df[df[“_c2”].apply(lambda x: x.isnumeric())]
这将起作用,如果您的df中的NA是NaN(np.NaN),这将不会影响您获取列的平均值,只有当您的NA是'NA',这是字符串时
(df.apply(pd.to_numeric,errors ='coerce',axis=1)).describe()
Out[9]:
_c0 _c1 _c2
count 3.0 0.0 2.000000
mean 2.0 NaN 29.500000
std 1.0 NaN 0.707107
min 1.0 NaN 29.000000
25% 1.5 NaN 29.250000
50% 2.0 NaN 29.500000
75% 2.5 NaN 29.750000
max 3.0 NaN 30.000000
更多信息
df.apply(pd.to_numeric,errors ='coerce',axis=1)# all object change to NaN and will not affect getting mean
Out[10]:
_c0 _c1 _c2
0 NaN NaN NaN
1 1.0 NaN 29.0
2 2.0 NaN NaN
3 3.0 NaN 30.0
这将起作用,如果您的df中的NA是NaN(np.NaN),这将不会影响您获取列的平均值,只有当您的NA是'NA',这是字符串时
(df.apply(pd.to_numeric,errors ='coerce',axis=1)).describe()
Out[9]:
_c0 _c1 _c2
count 3.0 0.0 2.000000
mean 2.0 NaN 29.500000
std 1.0 NaN 0.707107
min 1.0 NaN 29.000000
25% 1.5 NaN 29.250000
50% 2.0 NaN 29.500000
75% 2.5 NaN 29.750000
max 3.0 NaN 30.000000
更多信息
df.apply(pd.to_numeric,errors ='coerce',axis=1)# all object change to NaN and will not affect getting mean
Out[10]:
_c0 _c1 _c2
0 NaN NaN NaN
1 1.0 NaN 29.0
2 2.0 NaN NaN
3 3.0 NaN 30.0
请尝试
inplace=false
Yes,但如果NA是inplace=false,则不会将其删除它看起来像“RecId”、“Class”、“Age”是列名,但会出现在数据框中的值中。请尝试inplace=false
Yes,但如果NA是inplace=false,则不会将其删除它看起来像“RecId”、“Class”、“Age”是列名,但显示在数据框的值中。使用这两个选项,我在实现dropna:TypeError(“无法将%s转换为数字“%str(x))之前遇到了错误。您的数据框是否可能包含字符串“NA”而不是NAN?是的,确实如此。我以为dropna会删除任何不是数字的东西。也许df[~df[“\u c2”].str.contains('NA')]
,可能是精确匹配上的空间问题谢谢-肯定比我的精确匹配解决方案好,会更新答案。使用这两个选项,我在实现dropna之前遇到了一个错误:TypeError(“无法将%s转换为数字“%str(x))您的数据帧是否可能包含字符串“NA”而不是“NAN”?是的,确实如此。我想dropna会删除任何不是数字的内容。可能df[~df[“_c2”]]。str.contains('NA')]
,可能是精确匹配上的空间问题谢谢-肯定比我的精确匹配解决方案好,将更新答案。