python-3.x - 在数据框行中查找唯一 ID
问题描述
输入 - 超过 50k 行的数据框。
预期结果:按多列查找唯一 ID。
Fe有数据框:
id par1 par2 par3
1 a 1 AA
2 b 2 AB
3 c 3 AC
4 a 4 AD
5 d 3 AE
6 e 5 AD
7 d 1 AF
所以逻辑是,如果任何行共享公共参数 - 即相同的唯一 id,结果应该是这样的,由迭代产生:首先由 par1:
id par1 par2 par3 uniq_id
1 a 1 AA 1
2 b 2 AB 2
3 c 3 AC 3
4 a 4 AD 1
5 d 3 AE 4
6 e 5 AD 5
7 d 1 AF 4
然后通过par2:
id par1 par2 par3 uniq_id
1 a 1 AA 1
2 b 2 AB 2
3 c 3 AC 3
4 a 4 AD 1
5 d 3 AE 3
6 e 5 AD 5
7 d 1 AF 1
然后通过par3:
id par1 par2 par3 uniq_id
1 a 1 AA 1
2 b 2 AB 2
3 c 3 AC 3
4 a 4 AD 1
5 d 3 AE 3
6 e 5 AD 1
7 d 1 AF 1
然后应该检查是否仍然有任何误导: fe id=5
和id=3
should get uniq_id = 1
,因为 —id=7 is
uniq_id=1 and
id=7 share
par1 with
id=5 , and because of that
id=3` 也会发生变化。
我希望我试图解释的内容很清楚。目前只有我制作的可行解决方案 -multiple for
手动创建循环和比较值,但由于有很多观察,它可能需要很长时间才能执行。
解决方案
先用factorize
,Series.map
再用DataFrame.drop_duplicates
:
df['uniq_id'] = pd.factorize(df['par1'])[0] + 1
df['uniq_id'] = df['par2'].map(df.drop_duplicates('par2').set_index('par2')['uniq_id'])
df['uniq_id'] = df['par3'].map(df.drop_duplicates('par3').set_index('par3')['uniq_id'])
print (df)
id par1 par2 par3 uniq_id
0 1 a 1 AA 1
1 2 b 2 AB 2
2 3 c 3 AC 3
3 4 a 4 AD 1
4 5 d 3 AE 3
5 6 e 5 AD 1
6 7 d 1 AF 1
如果可能的话,可以创建更多列:
df['uniq_id'] = pd.factorize(df['par1'])[0] + 1
for col in ['par2','par3']:
df['uniq_id'] = df[col].map(df.drop_duplicates(col).set_index(col)['uniq_id'])
推荐阅读
- c++ - OpenCV haarcascades加载根本不起作用
- java - java InputStream 可以连续从方法中读取数据吗?
- python - 在python中优化阶乘函数
- oracle - (Oracle)有条件地跳过扫描表
- c++ - 链接器找不到重载的运算符
- php - 在 PHP 中获取函数变量
- amazon-web-services - Scala Spark 从 AWS S3 读取 - com.amazonaws.SdkClientException:无法从服务端点加载凭证
- mongodb - 如何检查猫鼬是否已连接?
- c# - C# 我的参数在当前上下文中不存在
- typescript - 模块“@react-native-firebase/firestore”没有导出成员“CollectionReference”。ts(2614)