【发布时间】:2023-04-10 04:39:01
【问题描述】:
我有一个数据框:
Name Hours_Worked
1 James 3
2 Sam 2.5
3 Billy T
4 Sarah A
5 Felix 5
第一个我如何计算我有非数字值的行数?
第二如何过滤以识别包含非数字值的行?
【问题讨论】:
标签: python-3.x pandas data-cleaning
我有一个数据框:
Name Hours_Worked
1 James 3
2 Sam 2.5
3 Billy T
4 Sarah A
5 Felix 5
第一个我如何计算我有非数字值的行数?
第二如何过滤以识别包含非数字值的行?
【问题讨论】:
标签: python-3.x pandas data-cleaning
使用to_numeric 和errors='coerce' 将非数字转换为NaNs 并通过isna 创建掩码:
mask = pd.to_numeric(df['Hours_Worked'], errors='coerce').isna()
#oldier pandas versions
#mask = pd.to_numeric(df['Hours_Worked'], errors='coerce').isnull()
然后将Trues 的值按sum 计数:
a = mask.sum()
print (a)
2
并按boolean indexing过滤:
df1 = df[mask]
print (df1)
Name Hours_Worked
3 Billy T
4 Sarah A
详情:
print (mask)
1 False
2 False
3 True
4 True
5 False
Name: Hours_Worked, dtype: bool
另一种检查数字的方法:
def check_num(x):
try:
float(x)
return False
except ValueError:
return True
mask = df['Hours_Worked'].apply(check_num)
【讨论】:
df.Hours_Worked.str.isnumeric() 在这里不起作用?
isnumeric() 也可以与花车一起使用,很好:)
在一天结束时,我这样做是为了在我的数字列中评估字符串:
df['Hr_String'] = pd.to_numeric(df['Hours_Worked'], errors='coerce')
我希望它在一个新列中,这样我就可以过滤并为我提供更多的流动性:
df[df['Hr_String'].isnull()]
返回:
Name Hours_Worked Hr_String
2 Billy T NaN
3 Sarah A NaN
然后我做了
df['Hr_String'].isnull().sum()
返回:
2
然后我想要总行数的百分比,所以我这样做了:
teststr['Hr_String'].isnull().sum() / teststr.shape[0]
返回:
0.4
总体而言,这种方法对我有用,它帮助我了解哪些字符串值与我的数字列混淆,并让我看到百分比,如果它真的很小,我可能会删除行进行分析。如果百分比很大,我必须弄清楚我是否可以估算它们或为它们找出其他东西。
【讨论】: