微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 比较不同列的字符串长度的数据帧

我试图获取不同列的字符串长度.看起来很简单:

df['a'].str.len()

但我需要将它应用于多个列.然后获得最低限度.

就像是:

df[['a','b','c']].str.len().min

我知道上面的内容不起作用,但希望你能得到这个想法.列a,b,c都包含名称,我想检索最短的名称.

此外,由于数据量巨大,我正在避免创建其他列以节省大小.

解决方法:

我认为你需要列表理解,因为字符串函数只适用于Series(列):

print ([df[col].str.len().min() for col in ['a','b','c']])

一个解决方案适用:

print ([df[col].apply(len).min() for col in ['a','b','c']])

样品:

df = pd.DataFrame({'a':['h','gg','yyy'],
                   'b':['st','dsws','sw'],
                   'c':['fffff','','rr'],
                   'd':[1,3,5]})

print (df)

     a     b      c  d
0    h    st  fffff  1
1   gg  dsws         3
2  yyy    sw     rr  5

print ([df[col].str.len().min() for col in ['a','b','c']])
[1, 2, 0]

时序:

#[3000 rows x 4 columns]
df = pd.concat([df]*1000).reset_index(drop=True)

In [17]: %timeit ([df[col].apply(len).min() for col in ['a','b','c']])
100 loops, best of 3: 2.63 ms per loop

In [18]: %timeit ([df[col].str.len().min() for col in ['a','b','c']])
The slowest run took 4.12 times longer than the fastest. This Could mean that an intermediate result is being cached.
100 loops, best of 3: 2.88 ms per loop

结论:

apply更快,但不适用于None.

df = pd.DataFrame({'a':['h','gg','yyy'],
                   'b':[None,'dsws','sw'],
                   'c':['fffff','','rr'],
                   'd':[1,3,5]})


print (df)
     a     b      c  d
0    h  None  fffff  1
1   gg  dsws         3
2  yyy    sw     rr  5

print ([df[col].apply(len).min() for col in ['a','b','c']])

TypeError: object of type ‘nonetype’ has no len()

print ([df[col].str.len().min() for col in ['a','b','c']])
[1, 2.0, 0]

编辑评论

#fail with None
print (df[['a','b','c']].applymap(len).min(axis=1))
0    1
1    0
2    2
dtype: int64
#working with None
print (df[['a','b','c']].apply(lambda x: x.str.len().min(), axis=1))
0    1
1    0
2    2
dtype: int64

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐