使用 for 循环结合嵌套的 if 语句,根据 Python 中不同 DataFrame 的 3 列创建新的 pandas DataFrame

Using a for loop combined with a nested if statement to create a new pandas DataFrame based on 3 columns of a different DataFrame in Python

trv_last = []
for i in range(0,len(trv)):
    if (trv_name_split.iloc[i,3] != None):
        trv_last = trv_name_split.iloc[i,3]
    elif (trv_name_split.iloc[i,2] != None):
        trv_last = trv_name_split.iloc[i,2]
    else: 
        trv_last = trv_name_split.iloc[i,1]
        
trv_last

这个 returns 'Campo' 这是我范围内的最后一个索引:

     0         1     2        3
  1 John    Doe     None    None
  2 Jane    K.      Martin  None
  :   :      :       :       :
972 Jino    Campo   None    None

如您所见,所有名称都在一栏中,我使用 str.split() 将它们分开。由于有些名字的名字中间是第一个,中间是最后一个,所以我只剩下 4 列。我只对他的姓氏感兴趣。

我的目标是创建一个只有姓氏的新 DF。这里的逻辑是,如果第 4 列不是“None”,那么它就是姓氏,如果其他都是“None”,则向后移动到第 2 列是姓氏。

感谢您的浏览,感谢您的帮助!

遍历 pandas 数据帧不是一个好主意。这就是他们制作 apply 的原因。最佳做法是使用应用和分配。

def build_last_name(row):
    if row.3:
        return row.3
    if row.2:
        return row.2
    return row.1

last_names = trv_name_split.apply(build_last_name, axis=1)
trv_name_split = trv_name_split.assign(last_name=last_names)

熟悉 apply 可以避免很多麻烦。 Here's the docs.

找到了我自己问题的答案..

trv_last = []
for i in range(0,len(trv)):
    if (trv_name_split.iloc[i,3] != None):
        trv_last.append(trv_name_split.iloc[i,3])
    elif (trv_name_split.iloc[i,2] != None):
        trv_last.append(trv_name_split.iloc[i,2])
    else: 
        trv_last.append(trv_name_split.iloc[i,1])
        
trv_last