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

时间:2019-11-21 23:55:13

标签: python python-3.x pandas

我正在使用pandas使用python自动化处理过程。以前,我会使用Excel PowerQuery来合并文件和处理数据,但是PowerQuery并没有我所需的通用性,因此我现在使用熊猫。我的过程一直进行到可以循环浏览文件,根据每个工作簿以正确的顺序选择所需的列,然后将其插入到数据框中。创建每个数据框后,然后将它们连接到一个数据框中并写入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])

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

此外,我需要确保日期列是真正的日期值。有时日期格式为MM-DD-YYYY或有时为MM / DD / YY等。这些都可以,但是如果日期列中的实际值是Excel可以使用的Excel序列号,那不是很好fomat作为日期。有什么方法可以将验证逻辑应用于整个数据框列,以确保有一个有效的日期而不是序列号?

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

任何意见和建议,我们将不胜感激!

2 个答案:

答案 0 :(得分:1)

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

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'])

答案 1 :(得分:0)

对于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序列号转换为日期的问题,我查看了already answered question。我假设您数据框中的序列号是整数类型:

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]

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