2017-01-17 163 views
1

我有一個DF使得大熊貓搜索串在多個列

 c_name f_name 
0  abc  abc12 
1  xyz  abc1 
2  mnq  mnq2 

的目標是找到橫跨兩列的子其所屬列的訣竅。應優先於c_name,如如果子在兩個列然後c_name得到優先用於例如:如果我在上面的數據幀尋找abc我應該以某種方式得到行0 abcc_name和行1 abc1f_name

爲了解決這個問題,我開始與 df[df['c_name'].str.contains('abc', case=False)] ,這將給我的結果c_name。現在的問題是如何排除已在f_name上執行相同操作的結果。任何幫助是極大的讚賞!

回答

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 
0

將您的第一個搜索結果標記爲2,如果新的搜索結果符合,則這將被覆蓋(按1)。

+0

如何的問題:)我知道該怎麼做,我只是不知道該怎麼辦這是因爲我不熟練熊貓 – Fizi

1
  • 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 
+0

我總是可以依靠你來通過w ith迴應:)非常感謝。它是一個有趣的方法 – Fizi