入力-5万行を超えるデータフレーム。
期待される結果:複数の列で一意のIDを検索します。
データフレームがあります:
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
次に、誤解を招く可能性があるかどうかを確認する必要があります。— id = 7 uniq_id = 1 id = 7 par1 id = 5 id = 3`も変更されるため、feid=5
とid=3
getを取得する必要があります。uniq_id = 1
is
and
share
with
, and because of that
私が何を説明しようとしているのかが明確であることを願っています。現時点では、私が作成した唯一の実用的なソリューションです。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'])
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加