使用if elif else语句从多个列执行For循环-或Numpy - Python

du7egjpx  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(138)

我有一个类似于下图的表-这是我手动添加的最后一个表,用于说明所需的结果
Image of tablesetup
为breed创建一列,合并列p1-p3,其中如果p1_dog为真,则添加p1值,如果p1_dog为假,但p2_dog为真,则添加p2值,如果为假,则查看p3_dog,如果为真,则添加p3值,否则打印-“不是狗”。
我试过使用for循环,也试过使用np.select。也许np.where应该工作,但不知道如何工作

breeds = []
for row in df_copy:
    if ['p1_dog']:
        breeds.append(df_copy['p1'])
    elif ['p2_dog']:
        breeds.append(df_copy['p2'])
    elif ['p3_dog']:
        breeds.append(df_copy['p3'])
    else:
        breeds.append('not a dog')

这只给予了每个存储中的值的完整列表
使用np.select,我在这里找到pandas if else conditions on multiple columns
这会给我一个布尔值列表

df_copy['breed'] = np.select([df_copy.p1_dog == True , df_copy.p2_dog == True], [df_copy.p1_dog, df_copy.p2_dog], default=df_copy.p3_dog)
p8h8hvxi

p8h8hvxi1#

肯定不是最漂亮的,也不是很好的维护,但在这种情况下,它会工作:

import pandas as pd
import numpy as np

df = pd.DataFrame({"p1": ["Chihuahua", "paper_towel", "basset", "Irish_terrier", "Pembroke"],
 "p1_dog": [True, False, True, True, False],
 "p2": ["malamute", "Labrador_retriever", "English_springer", "Irish_setter", "Cardigan"],
 "p2_dog": [True, True, True, True, False],
 "p3": ["kelpie", "spatula", "German_short-hared_pointer", "Chesapeake_Bay_Retriever", "Chihuahua"],
 "p3_dog": [True, False, True, True, True]
})

df['Wanted result'] = np.where(df["p1_dog"], df["p1"], np.where(df["p2_dog"], df["p2"], np.where(df["p3_dog"], df["p3"], "not a dog")))

print(df.to_string())

基本上就是链接np.where(),如果第1列的条件为True,则输出p1名称,如果为False,则检查下一个布尔列,依此类推。
输出:

[5 rows x 6 columns]
p1  p1_dog                  p2  p2_dog                          p3  p3_dog       Wanted result
0      Chihuahua    True            malamute    True                      kelpie    True           Chihuahua
1    paper_towel   False  Labrador_retriever    True                     spatula   False  Labrador_retriever
2         basset    True    English_springer    True  German_short-hared_pointer    True              basset
3  Irish_terrier    True        Irish_setter    True    Chesapeake_Bay_Retriever    True       Irish_terrier
4       Pembroke   False            Cardigan   False                   Chihuahua    True           Chihuahua

另外,请将您的 Dataframe 作为原始文本而不是图像发布。我不得不逐字复制 Dataframe ,有些名称甚至被切断。

相关问题