Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Pandas, how to create a unique ID based on the combination of many columns?

Tags:

python

pandas

I have a very large dataset, that looks like

df = pd.DataFrame({'B': ['john smith', 'john doe', 'adam smith', 'john doe', np.nan], 'C': ['indiana jones', 'duck mc duck', 'batman','duck mc duck',np.nan]})

df
Out[173]: 
            B              C
0  john smith  indiana jones
1    john doe   duck mc duck
2  adam smith         batman
3    john doe   duck mc duck
4         NaN            NaN

I need to create a ID variable, that is unique for every B-C combination. That is, the output should be

            B              C   ID
0  john smith  indiana jones   1
1    john doe   duck mc duck   2
2  adam smith         batman   3
3    john doe   duck mc duck   2 
4         NaN            NaN   0

I actually dont care about whether the index starts at zero or not, and whether the value for the missing columns is 0 or any other number. I just want something fast, that does not take a lot of memory and can be sorted quickly. I use:

df['combined_id']=(df.B+df.C).rank(method='dense')

but the output is float64 and takes a lot of memory. Can we do better? Thanks!

like image 945
ℕʘʘḆḽḘ Avatar asked Apr 15 '16 12:04

ℕʘʘḆḽḘ


People also ask

How do I get unique values in multiple columns in pandas?

You can get unique values in column (multiple columns) from pandas DataFrame using unique() or Series. unique() functions. unique() from Series is used to get unique values from a single column and the other one is used to get from multiple columns.

How do I get the number of unique values in a column in pandas?

To count unique values in the pandas dataframe column use Series. unique() function and then call the size to get the count. Series.


2 Answers

I think you can use factorize:

df['combined_id'] = pd.factorize(df.B+df.C)[0]
print df
            B              C  combined_id
0  john smith  indiana jones            0
1    john doe   duck mc duck            1
2  adam smith         batman            2
3    john doe   duck mc duck            1
4         NaN            NaN           -1
like image 170
jezrael Avatar answered Sep 30 '22 09:09

jezrael


Making jezrael's answer a little more general (what if the columns were not string?), you can use this compact function:

def make_identifier(df):
    str_id = df.apply(lambda x: '_'.join(map(str, x)), axis=1)
    return pd.factorize(str_id)[0]

df['combined_id'] = make_identifier(df[['B','C']])
like image 27
Nolan Conaway Avatar answered Sep 30 '22 11:09

Nolan Conaway