我有一个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
上执行相同的操作。任何帮助是极大的赞赏!
答案 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)
这是另一种简单的方法:
将目标“字符串”列连接到新的单个列中,例如
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;
}
在df['new_col'] = df['c_name'] + ' ' + df['f_name']
中搜索子字符串,例如
new_col
在完成其任务后删除result = df[df['new_col'].str.contains('abc')]
:
new_col
del results['new_col']