>>> 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=['123','76']
我有兴趣确定我的数据框中的哪些值以列表中的任何值开头.在我的例子中有3个案例:(0,A)以123开头; (1,A)以123开头; (2,A)以76开头.
有没有办法可以做到这一点而不循环我的每个值?
如果我对匹配值感兴趣,我可以这样做:
>>> d.isin(vals) A B C0 False False False1 False False False2 True False False3 False False False>>>
如果我对值是否从1个特定值开始感兴趣,我可以这样做:
>>> d.applymap(lambda x:x.startswith('123')) A B C0 True False False1 True False False2 False False False3 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 C0 True False False1 True False False2 True False False3 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 C0 True False False1 True False False2 True False False3 False False False
与使用apply相比,这是一种更简洁的方法
总结以上是内存溢出为你收集整理的python – Pandas – 识别以列表中的值开头的数据帧值全部内容,希望文章能够帮你解决python – Pandas – 识别以列表中的值开头的数据帧值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)