Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫搜索多列上的子字符串_Python_Pandas - Fatal编程技术网

Python 熊猫搜索多列上的子字符串

Python 熊猫搜索多列上的子字符串,python,pandas,Python,Pandas,我有一个这样的df c_name f_name 0 abc abc12 1 xyz abc1 2 mnq mnq2 目标是在两列之间找到一个子字符串,并知道它属于哪一列。首选项应该是c_name,因为如果子字符串在两列中,则c_name优先于,例如:如果我在上述数据帧中搜索abc,我应该以某种方式获得c_name的第0行abc,以及f_name的第1行abc1 为了解决这个问题,我从 df[df['c_name']

我有一个这样的df

       c_name  f_name 
0      abc     abc12  
1      xyz     abc1  
2      mnq     mnq2
目标是在两列之间找到一个子字符串,并知道它属于哪一列。首选项应该是
c_name
,因为如果子字符串在两列中,则
c_name
优先于,例如:如果我在上述数据帧中搜索
abc
,我应该以某种方式获得
c_name
的第0行
abc
,以及
f_name
的第1行
abc1

为了解决这个问题,我从
df[df['c_name'].str.contains('abc',case=False)]

这将为我提供
c_name
的结果。现在的问题是如何排除在
f_name
上执行相同操作时已有结果的行。非常感谢您的帮助

将您的第一个搜索结果标记为2。如果新的搜索结果符合要求,则此项将被覆盖(1)

import pandas as pd
row  =[['abcx','abcy'],
       ['efg','abcz'],
       ['higj','UK']]
df= pd.DataFrame(row)
df.columns = ['c_name', 'f_name']

print df[df['c_name'].str.contains('abc', case=False)]

delta_df =df[~df['c_name'].str.contains('abc', case=False)]
print delta_df[delta_df['f_name'].str.contains('abc', case=False)]
输出

  c_name f_name
0   abcx   abcy
  c_name f_name
1    efg   abcz
  • 堆叠成一系列
  • str.contains
    获取子字符串的真值
  • unstack
    返回数据帧
  • 子集结果以确保至少一个匹配
  • idxmax(1)
    获取列中的第一个
    True




下面是另一个简单的方法:

  • 将目标“字符串”列连接到一个新的单列中,例如

    df['new_col'] = df['c_name'] + ' ' + df['f_name']
    
  • new\u col
    中搜索子字符串,例如

    result = df[df['new_col'].str.contains('abc')]
    
  • 完成任务后,删除新列:

    del results['new_col']
    

  • 以下是一个例子:

    >>> df= pd.DataFrame(row, columns=['c_name', 'f_name'])
    >>> df
      c_name f_name
    0   abcx   abcy
    1    efg   abcz
    2   higj     UK
    >>> df['new_col'] = df['c_name'] + ' ' + df['f_name']
    >>> results = df[df['new_col'].str.contains('abc')]
    >>> del df['new_col'], results['new_col']
    >>> results
      c_name f_name
    0   abcx   abcy
    1    efg   abcz
    

    问题是怎样的:)我知道该怎么做,我只是不知道该怎么做,因为我对pandasI不太精通。我可以依靠你的回答:)非常感谢。这是一个有趣的方法这回答了你的问题吗?
    result = df[df['new_col'].str.contains('abc')]
    
    del results['new_col']
    
    >>> df= pd.DataFrame(row, columns=['c_name', 'f_name'])
    >>> df
      c_name f_name
    0   abcx   abcy
    1    efg   abcz
    2   higj     UK
    >>> df['new_col'] = df['c_name'] + ' ' + df['f_name']
    >>> results = df[df['new_col'].str.contains('abc')]
    >>> del df['new_col'], results['new_col']
    >>> results
      c_name f_name
    0   abcx   abcy
    1    efg   abcz