查找重复项并将 ID 添加为属性 pandas
finding duplicates and adding ID as attribute pandas
我在 geopandas 中处理大量(大约 450 万个)对象,其中每个对象都有一个唯一的 ID 号 ('PARCEL_SPI') 和另一个代码 ('PC_PLANNO')。
我想做的是编写一些代码,对于每个对象,找到具有相同 PLANNO 的所有其他对象,并将它们的 ID 号作为列表添加到新属性中,比如 'Same_code'目的。 df 称为 spine_copy.
这是我所拥有的一个快速示例:
PARCEL_SPI
PC_PLANNO
23908
LP12345
90435
LP12345
329048
LP90803
6409
LP2399
34534
LP90803
092824
LP12345
以及我想要的:
PARCEL_SPI
PC_PLANNO
Same_code
23908
LP12345
[90435, 092824]
90435
LP12345
[23908,092824]
329048
LP90803
34534
6409
LP2399
None
34534
LP90803
329048
092824
LP12345
[23908, 90435]
我不太确定该怎么做,但这是我使用 groupby 的尝试:
spine_copy.groupby('PC_PLANNO')['PARCEL_SPI'].apply(list)
但是,这并没有将列表添加为每个对象的新属性,我不确定该怎么做。
提前致谢!
也许你可以试试:
other = df.groupby('PC_PLANNO')['PARCEL_SPI'].apply(lambda x: x.tolist()).reset_index()
df = df.merge(other.rename(columns={'PARCEL_SPI':'Same_code'}), how='left', on=['PC_PLANNO'])
df['Same_code'] = df[['PARCEL_SPI', 'Same_code']].apply(lambda x: list(set(x['Same_code']) - set([x['PARCEL_SPI']])), axis=1)
输出:
PARCEL_SPI PC_PLANNO Same_code
0 23908 LP12345 [90435]
1 90435 LP12345 [23908]
2 329048 LP90803 [34534]
3 6409 LP2399 []
4 34534 LP90803 [329048]
此处不需要转换为列表 - 按 Series.duplicated
and for it use GroupBy.transform
with invert mask passed to numpy.where
:
过滤重复的行
m = spine_copy['PC_PLANNO'].duplicated(keep=False)
s = spine_copy.groupby('PC_PLANNO')['PARCEL_SPI'].transform(lambda x: x.to_numpy()[::-1])
spine_copy['Same_code'] = np.where(m, s, None)
print (spine_copy)
PARCEL_SPI PC_PLANNO Same_code
0 23908 LP12345 90435
1 90435 LP12345 23908
2 329048 LP90803 34534
3 6409 LP2399 None
4 34534 LP90803 329048
编辑:新数据:
m = spine_copy['PC_PLANNO'].duplicated(keep=False)
new = spine_copy.groupby('PC_PLANNO')['PARCEL_SPI'].apply(list).rename('Same_code')
vals = spine_copy.join(new, on='PC_PLANNO')[['PARCEL_SPI','Same_code']]
s = [[z for z in y if z != x] for x, y in vals.to_numpy()]
spine_copy['Same_code'] = np.where(m, s, None)
print (spine_copy)
PARCEL_SPI PC_PLANNO Same_code
0 23908 LP12345 [90435, 92824]
1 90435 LP12345 [23908, 92824]
2 329048 LP90803 [34534]
3 6409 LP2399 None
4 34534 LP90803 [329048]
5 92824 LP12345 [23908, 90435]
我在 geopandas 中处理大量(大约 450 万个)对象,其中每个对象都有一个唯一的 ID 号 ('PARCEL_SPI') 和另一个代码 ('PC_PLANNO')。
我想做的是编写一些代码,对于每个对象,找到具有相同 PLANNO 的所有其他对象,并将它们的 ID 号作为列表添加到新属性中,比如 'Same_code'目的。 df 称为 spine_copy.
这是我所拥有的一个快速示例:
PARCEL_SPI | PC_PLANNO |
---|---|
23908 | LP12345 |
90435 | LP12345 |
329048 | LP90803 |
6409 | LP2399 |
34534 | LP90803 |
092824 | LP12345 |
以及我想要的:
PARCEL_SPI | PC_PLANNO | Same_code |
---|---|---|
23908 | LP12345 | [90435, 092824] |
90435 | LP12345 | [23908,092824] |
329048 | LP90803 | 34534 |
6409 | LP2399 | None |
34534 | LP90803 | 329048 |
092824 | LP12345 | [23908, 90435] |
我不太确定该怎么做,但这是我使用 groupby 的尝试:
spine_copy.groupby('PC_PLANNO')['PARCEL_SPI'].apply(list)
但是,这并没有将列表添加为每个对象的新属性,我不确定该怎么做。
提前致谢!
也许你可以试试:
other = df.groupby('PC_PLANNO')['PARCEL_SPI'].apply(lambda x: x.tolist()).reset_index()
df = df.merge(other.rename(columns={'PARCEL_SPI':'Same_code'}), how='left', on=['PC_PLANNO'])
df['Same_code'] = df[['PARCEL_SPI', 'Same_code']].apply(lambda x: list(set(x['Same_code']) - set([x['PARCEL_SPI']])), axis=1)
输出:
PARCEL_SPI PC_PLANNO Same_code
0 23908 LP12345 [90435]
1 90435 LP12345 [23908]
2 329048 LP90803 [34534]
3 6409 LP2399 []
4 34534 LP90803 [329048]
此处不需要转换为列表 - 按 Series.duplicated
and for it use GroupBy.transform
with invert mask passed to numpy.where
:
m = spine_copy['PC_PLANNO'].duplicated(keep=False)
s = spine_copy.groupby('PC_PLANNO')['PARCEL_SPI'].transform(lambda x: x.to_numpy()[::-1])
spine_copy['Same_code'] = np.where(m, s, None)
print (spine_copy)
PARCEL_SPI PC_PLANNO Same_code
0 23908 LP12345 90435
1 90435 LP12345 23908
2 329048 LP90803 34534
3 6409 LP2399 None
4 34534 LP90803 329048
编辑:新数据:
m = spine_copy['PC_PLANNO'].duplicated(keep=False)
new = spine_copy.groupby('PC_PLANNO')['PARCEL_SPI'].apply(list).rename('Same_code')
vals = spine_copy.join(new, on='PC_PLANNO')[['PARCEL_SPI','Same_code']]
s = [[z for z in y if z != x] for x, y in vals.to_numpy()]
spine_copy['Same_code'] = np.where(m, s, None)
print (spine_copy)
PARCEL_SPI PC_PLANNO Same_code
0 23908 LP12345 [90435, 92824]
1 90435 LP12345 [23908, 92824]
2 329048 LP90803 [34534]
3 6409 LP2399 None
4 34534 LP90803 [329048]
5 92824 LP12345 [23908, 90435]