Home > Net >  nan values when creating a pd.Series through a function
nan values when creating a pd.Series through a function

Time:09-20

Assume we have the following dataframe

ap_comp = pd.DataFrame({'Name': ['Troll', 'Legolas'],'Code': [111, 222]})

and I passed it through the following function

a_mapping = pd.Series(apcompl['Code'], index=apcompl['Name']).to_dict()

my question is why the a_mapping returns as

{'Troll': nan, 'Legolas': nan}

why the nan appears? Should' t it be the following

{'Troll': 111, 'Legolas': 222}

CodePudding user response:

You have NaNs because of index alignment. The Series you pass in has an index that is different from the values passed as index, internally the constructor performs a reindexing, which gives NaN.

You would have needed to pass raw values (with .tolist(), .values or .to_numpy()) to the constructor, not a Series:

a_mapping = pd.Series(ap_comp['Code'].tolist(), index=ap_comp['Name']).to_dict()

But, much better, use:

a_mapping = ap_comp.set_index('Name')['Code'].to_dict()

output:

{'Troll': 111, 'Legolas': 222}

CodePudding user response:

As a complement to mozway's answer (where he indicates the reason why OP is having the problem and presents one solution, and one alternative path), one can also do it as follows

a_mapping = dict(zip(ap_comp['Name'], ap_comp['Code']))

[Out]: 
{'Troll': 111, 'Legolas': 222}

I find that the combination between dict and zip (which are Python's Built-in Functions) are quite convenient for this specific use cases (generating dictionaries from keys and values).

  • Related