我是python编码的新手,并且想根据现有列上的condition语句创建一个新列。
我使用python 2.7版本并在CentO上运行代码。
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列,仅当Filetype =='f'列时才应从Path列中提取该列中的数据,否则该列中的数据应为空值或无数据
答案 0 :(得分:1)
将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
答案 1 :(得分:0)
尝试使用这种方法从路径中获取最后一部分。使用“ /”作为分隔符从最右边一次将字符串拆分,并使用负索引获取最后一个元素(基本上是文件名):
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,其中由于矢量化,其速度比apply函数快:
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