如果条件满足python,遍历行并写一个新列
Iterate over rows and write a new column if condition meets python
我有两个独立的 df 帧要比较:
f1
P53-Malat1
Neat1-Malat1
Gap1-Malat1
和 f2:
intA,intB
P53-Malat1,Neat1-Malat1
Gap1-Malat1,Malat1-Pias3
我想遍历 f2 中每一列的行并查看它在 f1 中的 id。如果是,则打印该行+“找到”,如果否,则在单独的列中打印该行+“not_found”。
f2 中的第二列相同。
我尝试了这种方法,但它不起作用 - 我是否遗漏了什么?
with open("f1.txt","r") as f1:
content = f1.read().splitlines()
#print(content)
f2 = pd.read_csv("f2.csv")
f2["col1_search"] = f2.apply(lambda x: x["intA"]+"_found" if x in content else x["intA"]+"_not_found", axis=1)
f2["col2_search"] = f2.apply(lambda x: x["intB"]+"_found" if x in content else x["intB"]+"_not_found", axis=1)
所以所需的输出应该是 f2 这种格式:
col1_search,col2_search
P53-Malat1_found,Neat1-Malat1_found
Gap1-Malat1_found,Malat1-Pias3_not_found
谢谢。
如果我理解正确的话,内容是一个列表而不是数据框。如果是这种情况,您可以使用 .isin
,这将为每一行 return True
或 False
映射到您想要的任何后缀。
import pandas as pd
content = ['P53-Malat1','Neat1-Malat1','Gap1-Malat1']
f2 = pd.DataFrame({'intA': {0: 'P53-Malat1', 1: 'Gap1-Malat1'},
'intB': {0: 'Neat1-Malat1', 1: 'Malat1-Pias3'}})
f2['col1_search'] = f2.intA + f2.intA.isin(content).map({True:'_found',False:'_not_found'})
f2['col2_search'] = f2.intB + f2.intB.isin(content).map({True:'_found',False:'_not_found'})
输出
intA intB col1_search col2_search
0 P53-Malat1 Neat1-Malat1 P53-Malat1_found Neat1-Malat1_found
1 Gap1-Malat1 Malat1-Pias3 Gap1-Malat1_found Malat1-Pias3_not_found
或者如果您有很多列:
(f2 + f2.isin(content).replace({True:'_found',False:'_not_found'})).add_suffix('_search')
输出
intA_search intB_search
0 P53-Malat1_found Neat1-Malat1_found
1 Gap1-Malat1_found Malat1-Pias3_not_found
可以用
合并回原始数据
pd.concat([f2,(f2 + f2.isin(content).replace({True:'_found',False:'_not_found'})).add_suffix('_search')], axis=1)
输出
intA intB intA_search intB_search
0 P53-Malat1 Neat1-Malat1 P53-Malat1_found Neat1-Malat1_found
1 Gap1-Malat1 Malat1-Pias3 Gap1-Malat1_found Malat1-Pias3_not_found
这是您如何使用 np.where
的示例
data = {'Category' : ['First', 'Second', 'Third'],
'First_Numbers' : [10, 10, 10],
'Second_Numbers' : [20, 20, 20],
'Third_Numbers' : [9, 21, 15]
}
df = pd.DataFrame(data)
comp_column = np.where((df['Third_Numbers'] < df['Second_Numbers']) & (df['Third_Numbers'] > df['First_Numbers']), 'found', 'not found')
df['check'] = comp_column
df
我插入了一些示例数据,您应该可以用自己的数据替换这些数据。现在我看到你想比较 2 个不同的 df,所以我建议合并它们,这样你就只在一个 df 上工作。这是 merging/joining/concating pandas df: https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html
的最佳文档
f2 = pd.read_csv("f2.csv")
def transform(path:str,x):
with open(path,"r") as f1:
content = f1.read().splitlines()
if x in content:
return f"{x}_found"
return f"{x}_not_found"
f2["col1_search"] = f2['intA'].apply(lambda x:transform("f2.csv", x.intA),axis=1)
f2["col2_search"] = f2['intB'].apply(lambda x:transform("f2.csv", x.intB),axis=1)
在此处输入代码
我有两个独立的 df 帧要比较:
f1
P53-Malat1
Neat1-Malat1
Gap1-Malat1
和 f2:
intA,intB
P53-Malat1,Neat1-Malat1
Gap1-Malat1,Malat1-Pias3
我想遍历 f2 中每一列的行并查看它在 f1 中的 id。如果是,则打印该行+“找到”,如果否,则在单独的列中打印该行+“not_found”。
f2 中的第二列相同。
我尝试了这种方法,但它不起作用 - 我是否遗漏了什么?
with open("f1.txt","r") as f1:
content = f1.read().splitlines()
#print(content)
f2 = pd.read_csv("f2.csv")
f2["col1_search"] = f2.apply(lambda x: x["intA"]+"_found" if x in content else x["intA"]+"_not_found", axis=1)
f2["col2_search"] = f2.apply(lambda x: x["intB"]+"_found" if x in content else x["intB"]+"_not_found", axis=1)
所以所需的输出应该是 f2 这种格式:
col1_search,col2_search
P53-Malat1_found,Neat1-Malat1_found
Gap1-Malat1_found,Malat1-Pias3_not_found
谢谢。
如果我理解正确的话,内容是一个列表而不是数据框。如果是这种情况,您可以使用 .isin
,这将为每一行 return True
或 False
映射到您想要的任何后缀。
import pandas as pd
content = ['P53-Malat1','Neat1-Malat1','Gap1-Malat1']
f2 = pd.DataFrame({'intA': {0: 'P53-Malat1', 1: 'Gap1-Malat1'},
'intB': {0: 'Neat1-Malat1', 1: 'Malat1-Pias3'}})
f2['col1_search'] = f2.intA + f2.intA.isin(content).map({True:'_found',False:'_not_found'})
f2['col2_search'] = f2.intB + f2.intB.isin(content).map({True:'_found',False:'_not_found'})
输出
intA intB col1_search col2_search
0 P53-Malat1 Neat1-Malat1 P53-Malat1_found Neat1-Malat1_found
1 Gap1-Malat1 Malat1-Pias3 Gap1-Malat1_found Malat1-Pias3_not_found
或者如果您有很多列:
(f2 + f2.isin(content).replace({True:'_found',False:'_not_found'})).add_suffix('_search')
输出
intA_search intB_search
0 P53-Malat1_found Neat1-Malat1_found
1 Gap1-Malat1_found Malat1-Pias3_not_found
可以用
合并回原始数据pd.concat([f2,(f2 + f2.isin(content).replace({True:'_found',False:'_not_found'})).add_suffix('_search')], axis=1)
输出
intA intB intA_search intB_search
0 P53-Malat1 Neat1-Malat1 P53-Malat1_found Neat1-Malat1_found
1 Gap1-Malat1 Malat1-Pias3 Gap1-Malat1_found Malat1-Pias3_not_found
这是您如何使用 np.where
的示例data = {'Category' : ['First', 'Second', 'Third'],
'First_Numbers' : [10, 10, 10],
'Second_Numbers' : [20, 20, 20],
'Third_Numbers' : [9, 21, 15]
}
df = pd.DataFrame(data)
comp_column = np.where((df['Third_Numbers'] < df['Second_Numbers']) & (df['Third_Numbers'] > df['First_Numbers']), 'found', 'not found')
df['check'] = comp_column
df
我插入了一些示例数据,您应该可以用自己的数据替换这些数据。现在我看到你想比较 2 个不同的 df,所以我建议合并它们,这样你就只在一个 df 上工作。这是 merging/joining/concating pandas df: https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html
的最佳文档f2 = pd.read_csv("f2.csv")
def transform(path:str,x):
with open(path,"r") as f1:
content = f1.read().splitlines()
if x in content:
return f"{x}_found"
return f"{x}_not_found"
f2["col1_search"] = f2['intA'].apply(lambda x:transform("f2.csv", x.intA),axis=1)
f2["col2_search"] = f2['intB'].apply(lambda x:transform("f2.csv", x.intB),axis=1)
在此处输入代码