【问题标题】:Write a python code to create a new csv column from existing column using conditional statements编写 python 代码以使用条件语句从现有列创建新的 csv 列
【发布时间】:2019-05-28 03:53:39
【问题描述】:

我是 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,仅当列 Filetype=='f' 时,该列中的数据才应从 Path 列中提取,否则该列中的数据应为空值或无数据

【问题讨论】:

    标签: python pandas python-2.7


    【解决方案1】:

    numpy.wherepandas.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 不是必需的,但无论如何这是解决方案。
    【解决方案2】:

    尝试使用这种方法从路径中获取最后一部分。使用“/”作为分隔符将字符串从最右侧拆分一次,并使用负索引获取最后一个元素(基本上是文件名):

    
    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 的 where 比 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
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2020-09-18
      • 2015-07-27
      • 1970-01-01
      • 2012-05-19
      相关资源
      最近更新 更多