如何在包含全名的列表中提取名称名字的第一部分并丢弃一部分名称

问题描述

我有一个包含一列名称的 CSV 文件。我想要的是一个 python 代码来检查列中的每个名称并查看名称是否有多个部分,它只需要第一部分并将其附加到新的 CSV 文件列表中,同时跳过任何只有一个部分的名称在旧的 CSV 文件中。

例如

输入 CSV 文件

Column1
Metarhizium robertsii ARSEF 23
Danio rerio
Parascaris equorum
Hevea
Gossypium
Vitis vinifera

输出的CSV文件应该是

Column1
Metarhizium
Danio
Parascaris
Vitis

解决方法

名称总是用空格分隔吗?

您可以在 python 中使用 re 模块并使用正则表达式,或者如果您正在寻找简单的东西,您也可以在 python 中使用 str.split() 方法:

for name in column:
    split_name = name.split(' ',1) #Splits the name once after the first space and returns a list of strings
    if len(split_name) > 1: new_csv.write(split_name[0]) #write the first part of the split up name into the new csv
   
,

您可以拆分然后应用函数 len 来屏蔽结果,然后获取按行过滤的第一个元素。

import pandas as pd
df = pd.read_csv("input.csv")
splitted = df.Column1.apply(lambda x: x.split())
output = splitted[splitted.apply(len) > 1].apply(lambda x: x[0])
output.to_csv("output.csv")
# >,Column1
#  0,Metarhizium
#  1,Danio
#  2,Parascaris
#  5,Vitis
,

您可以先为那些包含多个单词的值创建一个标志,然后使用 apply() 方法并编写一个 lambda 函数来检索所有名称中的第一个单词。

flag = df.loc[:,'Column1'].str.split(' ').apply(len) > 1
split_names = lambda name: name.split()[0] if (len(name.split())) else None
new_df = df.loc[flag,'Column1'].apply(split_names)
new_df.to_csv('output.csv',index=False)