如何根据列值的长度从pandas数据帧中删除一行?

eve*_*007 9 python string-length dataframe pandas

在以下内容中pandas.DataFframe:

df = 
    alfa    beta   ceta
    a,b,c   c,d,e  g,e,h
    a,b     d,e,f  g,h,k
    j,k     c,k,l  f,k,n
Run Code Online (Sandbox Code Playgroud)

如何删除alfa的列值超过2个元素的行?这可以使用长度函数来完成,我知道但没有找到具体的答案.

df = df[['alfa'].str.split(',').map(len) < 3]
Run Code Online (Sandbox Code Playgroud)

Ste*_*uch 5

您可以使用依次对每一行进行该测试 pandas.DataFrame.apply()

print(df[df['alfa'].apply(lambda x: len(x.split(',')) < 3)])
Run Code Online (Sandbox Code Playgroud)

给出:

  alfa   beta   ceta
1  a,b  d,e,f  g,h,k
2  j,k  c,k,l  f,k,n
Run Code Online (Sandbox Code Playgroud)


mik*_*ila 5

这是一个最容易记住的选项,它仍然包含 DataFrame,它是 Pandas 的“流血之心”:

1) 在数据框中创建一个具有长度值的新列:

df['length'] = df.alfa.str.len()
Run Code Online (Sandbox Code Playgroud)

2) 使用新列的索引:

df = df[df.length < 3]
Run Code Online (Sandbox Code Playgroud)

然后与上述时间进行比较,在这种情况下,由于数据非常小,因此与上述时间无关,并且通常不如您记住如何做某事而不必中断工作流程的可能性重要:

第1步:

%timeit df['length'] = df.alfa.str.len()
Run Code Online (Sandbox Code Playgroud)

每个循环 359 µs ± 6.83 µs(7 次运行的平均值 ± 标准偏差,每次 1000 次循环)

第2步:

df = df[df.length < 3]
Run Code Online (Sandbox Code Playgroud)

每个循环 627 µs ± 76.9 µs(7 次运行的平均值 ± 标准偏差,每次 1000 次循环)

好消息是,当规模增长时,时间不会线性增长。例如,对 30,000 行数据执行相同操作大约需要 3ms(因此 10,000x 数据,3x 速度增加)。Pandas DataFrame 就像一列火车,需要能量来让它运行(所以在绝对比较下对于小事情来说不是很好,但客观上并没有多大关系......因为小数据无论如何都很快)。