我正在创建一个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
这是我所做的:
我迭代所有文件并获取目录路径以备份所有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
中。
现在,我将每个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
,它们正在工作,但我感到困惑的是,为什么他们没有做任何事情。
我们将不胜感激任何帮助。
答案 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()
在编写时,我不会处理路径/文件/目录管理,因为这似乎超出了您的讨论范围。