Я новичок в кодировании Python и хотел создать новый столбец на основе оператора условия для существующих столбцов.
Я использую версию python 2.7 и запускаю код на CentOs.
import pandas as pd
file1 = pd.read_csv("/root/Documents/temp_file_{}.csv".format(timestr))
file1['FileName'] = ''
file1['FileName'] = file1['FileType'].apply(lambda x: df['Path'].str.extract('[^/]+$', expand=False) if x=='f' else '')
file1.to_csv('/root/Documents/temp1_file_{}.csv'.format(timestr),index = False)
Ниже мой файл CSV:
FileType,Path
d,/
f,/documents/csv/.zip
d,/documents/images
d,/hive/28374849
f,/hadoop/jdjdjd/dnejfn.img
Требуемый CSV-файл:
FileType,Path,FileName
d,/,
f,/documents/csv/.zip,.zip
d,/documents/images,
d,/hive/28374849,
f,/hadoop/jdjdjd/dnejfn.img,dnejfn.img
Я хочу создать новый столбец FileName, где данные в этом столбце должны быть извлечены из столбца Path только тогда, когда столбец Filetype == 'f', иначе данные в этом столбце должны быть нулевым значением или без данных
Попробуйте использовать этот подход, чтобы получить последнюю часть из путей. Разделите строку с самой правой стороны один раз, используя «/» в качестве разделителя, и выберите последний элемент (который в основном является именем файла), используя отрицательную индексацию:
file1['FileName'] = ''
file1['FileName'] = file1.apply(lambda x: x['Path'].rsplit("/", 1)[-1] if x["FileType"]=='f' else '' , axis=1)
file1
FileType Path FileName
0 d /
1 f /documents/csv/.zip .zip
2 d /documents/images
3 d /hive/28374849
4 f /hadoop/jdjdjd/dnejfn.img dnejfn.img
используя numpy, где это быстрее, чем функция применения из-за векторизации:
file1['FileName'] = np.where(file1["FileType"]=='f', file1['Path'].str.rsplit("/", n=1).str[-1], '')
FileType Path FileName
0 d /
1 f /documents/csv/.zip .zip
2 d /documents/images
3 d /hive/28374849
4 f /hadoop/jdjdjd/dnejfn.img dnejfn.img
Использование numpy.where
с pandas.Series.str.rsplit
:
import numpy as np
import pandas as pd
df['FileName'] = np.where(df['FileType'].eq('f'),df['Path'].str.rsplit('/').str.get(-1), '')
Выход:
FileType Path FileName
0 d /
1 f /documents/csv/.zip .zip
2 d /documents/images
3 d /hive/28374849
4 f /hadoop/jdjdjd/dnejfn.img dnejfn.img
numpy
не требуется, но это решение в любом случае.