Python Pandas将列值更改为NULL并返回其原始值

时间:2018-08-04 16:31:49

标签: python excel pandas

我正在创建一个Python脚本,该脚本会自动将列值更改为NULL,然后再通过电子邮件发送。

我的目标是由于机密数据而暂时更改某些列值。看起来像这样:

svc_no   last_name   first_name   acc_no     some_column
12345    Parker      Peter        1111111    some_value
11111    Stark       Tony         2222222    some_value
22222    Rogers      Steve        3333333    some_value

我有多个Excel文件,我将把Excel文件发送给某人。有人会对这些Excel文件进​​行一些处理,但是在我通过电子邮件发送该文件之前,由于机密性,我需要将某些列值更改为NULL

我想要的输出将是这样的:

svc_no   last_name   first_name   acc_no     some_column
12345    NULL        NULL         NULL       some_value
11111    NULL        NULL         NULL       some_value
22222    NULL        NULL         NULL       some_value

这是我所做的:

  1. 我迭代所有文件并获取目录路径以备份所有Excel文件,这些文件我计划用作以后返回列的原始值的参考。我使用了 os ,* shutil **和 glob 库。

    path = os.path.absolute(__file__)
    new_path = path + 'source'
    
    files = []
    
    if not os.path.exists(new_path):
        os.makedirs(new_path)
    
    for file in files:
        if file not in new_path:
            shutil.copy(file, new_path)
    # line continue in number 2 list
    

这些代码将在与脚本相同的目录中创建一个文件夹,并将所有Excel文件复制到新创建的目录new_path中。

  1. 现在,我将每个Excel文件声明为一个DataFrame,然后使用NULL将列值更改为.loc

            df = pd.read_excel(file)
            df.loc[df['l_name'].notnull(), 'last_name'] = 'NULL'
    

我也尝试插入包含NULL值的列,并使用iloc将其复制到所需的列,尽管也没有任何反应。它也没有创建列。

df.insert(loc=5, column='empty_column', value='NULL')
df.iloc[:,1] = df.iloc[:,5]

我的问题是,它不会将last_name列的值更改为NULL。还有另一种方法吗?

我在某些项目中已经使用了.iloc.loc,它们正在工作,但我感到困惑的是,为什么他们没有做任何事情。

我们将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:1)

我真的没有在这里看到这个问题。您似乎使事情复杂化了。这不够吗?

df

0   12345   Parker  Peter   1111111 some_value
1   11111   Stark   Tony    2222222 some_value
2   22222   Rogers  Steve   3333333 some_value

创建机密版本:

confidential_columns = ['last_name', 'first_name', 'acc_no']

confidential_df = df.copy()
confidential_df[confidential_columns] = 'NULL'

您得到了:

confidential_df

0   12345   NULL    NULL    NULL    some_value
1   11111   NULL    NULL    NULL    some_value
2   22222   NULL    NULL    NULL    some_value

然后根据某些决定来决定要写哪个:

confidential = True

def write()
    writer = pd.ExcelWriter('output.xlsx')
    if confidential:
        confidential_df.to_excel(writer, sheet_name='report')
    else:
         df.to_excel(writer, sheet_name='report')

write()

在编写时,我不会处理路径/文件/目录管理,因为这似乎超出了您的讨论范围。