如何将验证更新/应用于熊猫列



我正在使用pandas使用python自动化一个过程。 以前我会使用 Excel PowerQuery 来组合文件和操作数据,但 PowerQuery 不像我需要的那样通用,所以我现在使用 pandas。 我让这个过程工作到可以循环访问文件,根据每个工作簿以正确的顺序选择我需要的列,然后将其插入到数据帧中。 创建每个数据帧后,我将它们连接成单个数据帧并写入 csv。 在编写之前,我需要对某些列应用一些验证。

例如,我有一个库存编号列,其长度始终需要正好为 11 个字符。 有时,根据工作簿的不同,数据将缺少前导零或包含超过 11 个字符(但应删除这些额外的字符(。 我知道我需要做的是

STOCK_NUM.zfill(13)[:13] 

但我不确定如何实际修改现有的数据帧值。 我是否真的需要遍历数据帧,或者有没有办法将格式应用于整个列?

例如

dataset = [['51346812942315.01', '01-15-2018'], ['13415678', '01-15-2018'], ['5134687155546628', '01/15/2018']] 
df = pd.DataFrame(dataset, columns = ['STOCK_NUM', 'Date']) 
for x in df["STOCK_NUM"]:
print(x.zfill(13)[:13])

我想知道将该格式应用于现有值的最佳方法,并且仅在这些值存在时才存在(即,如果有空值,则不要触摸它(。

此外,我需要确保日期列是真正的日期值。 有时日期的格式为月-日-年,有时为月/日/年等。其中任何一个都很好,但不好的是,如果日期列中的实际值是Excel可以作为日期的Excel序列号。 有没有办法将验证逻辑应用于整个数据帧列,以确保有一个有效的日期而不是序列号?

老实说,我不知道如何处理这个日期问题。

任何和所有的建议,见解将不胜感激!

不是专家,但从我可以在这里和那里收集的东西中,你可以尝试尝试:

df['STOCK_NUM']=df['STOCK_NUM'].str.zfill(13)

其次:

df['STOCK_NUM'] = df['STOCK_NUM'].str.slice(0,13)

对于第一部分。 对于日期,您可以对以下日期进行try-except

df['Date'] = pd.to_datetime(df['Date'])

对于您的STOCK_NUM问题,您可能会将函数应用于列,但我处理此问题的方式是使用列表推导。我要做的第一件事是用唯一的字符串替换STOCK_NUM列中的所有 NA,然后应用列表理解,如下面的代码所示:

import pandas as pd
dataset = [['51346812942315.01', '01-15-2018'], ['13415678', '01-15-2018'], ['5134687155546628', '01/15/2018'], [None,42139]] 
df = pd.DataFrame(dataset, columns = ['STOCK_NUM', 'Date'])
#replace NAs with a string
df.STOCK_NUM.fillna('IS_NA',inplace=True)
#use list comprehension to reformat the STOCK_NUM column 
df['STOCK_NUM'] = [None if i=='IS_NA' else i.zfill(13)[:13] for i in df.STOCK_NUM]

然后,对于您有关将 excel 序列号转换为日期的问题,我查看了一个已经回答的问题。我假设数据帧中的序列号是整数类型:

import datetime
def xldate_to_datetime(xldate):
temp = datetime.datetime(1900, 1, 1)
delta = datetime.timedelta(days=xldate) - datetime.timedelta(days=2)
return pd.to_datetime(temp+delta)
df['Date'] = [xldate_to_datetime(i) if type(i)==int else pd.to_datetime(i) for i in df.Date]

希望这对您有用!如果是,请接受此答案,否则请回复仍然存在的问题。

最新更新