我遇到了这个特定的问题,我有一个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