加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Pandas – 识别以列表中的值开头的数据帧值

发布时间:2020-12-20 11:55:12 所属栏目:Python 来源:网络整理
导读:说我有以下数据帧: import pandas as pd d=pd.DataFrame() d['A']=['12345','12354','76','4'] d['B']=['4442','2345','33','5'] d['C']=['5553','4343','5'] d A B C0 12345 4442 55531 12354 2345 43432 76 33 333 4 5 5 并说我有3个感兴趣的值: vals=['
说我有以下数据帧:

>>> import pandas as pd
>>> d=pd.DataFrame()
>>> d['A']=['12345','12354','76','4']
>>> d['B']=['4442','2345','33','5']
>>> d['C']=['5553','4343','5']
>>> d
       A     B     C
0  12345  4442  5553
1  12354  2345  4343
2     76    33    33
3      4     5     5

并说我有3个感兴趣的值:

>>> vals=['123','76']

我有兴趣确定我的数据框中的哪些值以列表中的任何值开头.在我的例子中有3个案例:(0,A)以123开头; (1,A)以123开头; (2,A)以76开头.

有没有办法可以做到这一点而不循环我的每个值?

如果我对匹配值感兴趣,我可以这样做:

>>> d.isin(vals)
       A      B      C
0  False  False  False
1  False  False  False
2   True  False  False
3  False  False  False
>>>

如果我对值是否从1个特定值开始感兴趣,我可以这样做:

>>> d.applymap(lambda x:x.startswith('123'))
       A      B      C
0   True  False  False
1   True  False  False
2  False  False  False
3  False  False  False
>>>

但是,如何将这两个结合起来找到以列表中的任何值开头的任何值?

解决方法

您可以使用apply with lambda调用str.contains来构造正则表达式模式并依次测试每个列:

In [9]:
vals=['123','76']
v = ['^' + x for x in vals]
d.apply(lambda x: x.str.contains('|'.join(v)))

Out[9]:
       A      B      C
0   True  False  False
1   True  False  False
2   True  False  False
3  False  False  False

由此产生的正则表达式模式:

In [10]:
'|'.join(v)

Out[10]:
'^123|^76'

更新

实际上你可以使用stack和unstack来做到这一点,这样你最初可以将所有列堆叠到一个列中,用正则表达式模式调用str.contains然后取消堆栈回原始形式:

In [9]:
vals=['123','76']
v = ['^' + x for x in vals]
d.stack().str.contains('|'.join(v)).unstack()

Out[9]:
       A      B      C
0   True  False  False
1   True  False  False
2   True  False  False
3  False  False  False

与使用apply相比,这是一种更简洁的方法

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读