如何创建字典来查找丢失的零?



我遇到了这个特定的问题,我有一个ID号码的数据框。其中一些账号已经去掉了前导零。

ID
345
345
543
000922
000345
000345
000543

所以我想做的是创建一种通用的方法来检查我们是否省略了前导零。基本上,在我的真实数据集中有数百万行。因此,我想使用pandas方法来表示是否有一个ID的部分与带有0的部分匹配,并将其放入另一个数据帧中,以便我可以进一步检查。

我这样做:

new_df = df.loc[df['ID'].isin(df['ID'])]

我这样做的原因是我想过滤数据集,以查找是否有任何id在完整的id内。

现在我有

ID
345
345
543
000345
000345
000543

我可以使用。unique()来获得每个唯一组合的一系列。

ID
345
543
000345
000543

对于小数据集来说,这很好。但是对于数百万行的数据,我想知道如何使检查变得更容易。

我试图找到一种方法来创建一个字典,其中键是3位数字,值是它的完整ID。反之亦然。任何关于这方面的建议都会很感激。如果有人有任何关于检查掉零的不同想法的建议,除了字典方法,这也会很有帮助。

注意:不总是3位数。例如,可以是4567,而实际值应该是004567。

一个选项是去掉行距"0"s:

out = df['ID'].str.lstrip('0').unique()

输出:

array(['345', '543', '922'], dtype=object)

或添加"0"s:

out = df['ID'].str.zfill(df['ID'].str.len().max()).unique()

输出:

array(['000345', '000543', '000922'], dtype=object)

使用说明:

print (df)
ID
0     345
1     345
2     540
3    2922
4  002922
5  000344
6  000345
7  000543
#filter ID starting by 0 to Series
d = df.loc[df['ID'].str.startswith('0'), 'ID']
#create index in Series with remove zeros from left side
d.index = d.str.lstrip('0')
print (d)
ID
2922    002922
344     000344
345     000345
543     000543
Name: ID, dtype: object
#dict all possible values
print (d.to_dict())
{'2922': '002922', '344': '000344', '345': '000345', '543': '000543'}
#compare if exist indices in original ID column and create dict
d = d[d.index.isin(df['ID'])].to_dict()
print (d)
{'2922': '002922', '345': '000345', '543': '000543'}

创建字典,查找可能受影响的记录。

# Creates a dummy dataframe.
df = pd.DataFrame(['00456', '0000456', '567', '00567'], columns=['ID'])
df['stripped'] = pd.to_numeric(df['ID'])
df['affected_id'] = df.ID.str.len() == df.stripped.astype(str).str.len()
df
ID  stripped  affected_id
0    00456       456        False
1  0000456       456        False
2      567       567         True
3    00567       567        False
# Creates a dictionary of potentially affected records.
d = dict()
for i in df[df.affected_id == True].stripped.unique():  
d[i] = df[(df.stripped == i) & (df.ID != str(i))].ID.unique().tolist()
d
{567: ['00567']}

如果您想将剥离的记录包含到列表中,则:

for i in df[df.affected_id == True].stripped.unique():
d[i] = df[df.stripped == i].ID.unique().tolist()
d
{567: ['567', '00567']}

可以将列类型转换为int

m = df['ID'].ne(df['ID'].astype(int))
print(m)
0    False
1    False
2    False
3     True
4     True
5     True
Name: ID, dtype: bool
print(df[m])
ID
3  000345
4  000345
5  000543

最新更新