как извлечь первую часть имени(имя) в списке, содержащем полные имена, и отказаться от имен с одной частью

#python #list #csv #bioinformatics #biopython

Вопрос:

У меня есть CSV-файл, содержащий один столбец имен. я хочу, чтобы код python проверял каждое имя в столбце и проверял, содержит ли имя более одной части, он берет только первую часть и добавляет ее в новый список файлов CSV, пропуская при этом любое имя, содержащее только одну часть в старом файле CSV.

например

входной CSV-файл

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

Выходной CSV-файл должен быть

 Column1
Metarhizium
Danio
Parascaris
Vitis
 

Ответ №1:

Вы можете разделить, затем применить функцию 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
 

Ответ №2:

Всегда ли имена разделяются пробелом?

Вы можете использовать re модуль в python и использовать выражения регулярных выражений, или, если вы ищете что-то простое, вы также можете использовать str.split() метод в python:

 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
   
 

Ответ №3:

Сначала вы можете создать флаг для тех значений, которые содержат более одного слова, затем использовать apply() метод и написать лямбда-функцию для извлечения первого слова во всех именах.

 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)