#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)