pandas在多列

时间:2017-01-17 18:11:49

标签: python pandas

我有一个df这样

       c_name  f_name 
0      abc     abc12  
1      xyz     abc1  
2      mnq     mnq2

目标是在两列中找到一个子串,知道它属于哪一列。首选应该是c_name,如果子串在两个列中,那么c_name优先为例如:如果我在上面的数据帧中搜索abc我应该以某种方式得到第0行abc的{​​{1}}和c_name的第1行abc1

为了解决这个问题,我开始了 f_name 这会给我df[df['c_name'].str.contains('abc', case=False)]的结果。现在的问题是如何排除我已经拥有结果的行在c_name上执行相同的操作。任何帮助是极大的赞赏!

4 个答案:

答案 0 :(得分:2)

  • stack成一系列
  • str.contains获取子字符串的真值
  • unstack获取数据框
  • 子集结果以确保至少一次匹配
  • idxmax(1)在列
  • 中获得第一个True
def find_subtext(df, txt):
    contains = df.stack().str.contains(txt).unstack()
    return contains[contains.any(1)].idxmax(1)
find_subtext(df, 'abc')

0    c_name
1    f_name
dtype: object
df.assign(abc=find_subtext(df, 'abc'))

  c_name f_name     abc
0    abc  abc12  c_name
1    xyz   abc1  f_name
2    mnq   mnq2     NaN

答案 1 :(得分: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

答案 2 :(得分:0)

将您的第一个搜索结果标记为2.如果新搜索结果符合,则会覆盖(按1)。

答案 3 :(得分:0)

这是另一种简单的方法:

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

    template<bool external_condition_1, external_condition_2>myloop(){
    for (int i = 0; i < 100000, i++){
      if (external_condition_1 || (external_condition_2 && internal_condition[i]){
         run_some_code;
      }
      else{
         run_some_other_code;
      }
      run_lots_of_other_code;
    }
    
  2. df['new_col'] = df['c_name'] + ' ' + df['f_name'] 中搜索子字符串,例如

    new_col
  3. 在完成其任务后删除result = df[df['new_col'].str.contains('abc')]

    new_col


这是一个示例:

del results['new_col']