Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Warning with loc function with pandas dataframe

Tags:

pandas

While working on a SO Question i came across a warning error using with loc, precise details are as belows:

DataFrame Samples:

First dataFrame df1 :

>>> data1 = {'Sample': ['Sample_A','Sample_D', 'Sample_E'],
...         'Location': ['Bangladesh', 'Myanmar', 'Thailand'],
...         'Year':[2012, 2014, 2015]}

>>> df1 = pd.DataFrame(data1)
>>> df1.set_index('Sample')
            Location  Year
Sample
Sample_A  Bangladesh  2012
Sample_D     Myanmar  2014
Sample_E    Thailand  2015

Second dataframe df2:

>>> data2 = {'Num': ['Value_1','Value_2','Value_3','Value_4','Value_5'],
...         'Sample_A': [0,1,0,0,1],
...         'Sample_B':[0,0,1,0,0],
...         'Sample_C':[1,0,0,0,1],
...         'Sample_D':[0,0,1,1,0]}
>>> df2 = pd.DataFrame(data2)
>>> df2.set_index('Num')
         Sample_A  Sample_B  Sample_C  Sample_D
Num
Value_1         0         0         1         0
Value_2         1         0         0         0
Value_3         0         1         0         1
Value_4         0         0         0         1
Value_5         1         0         1         0


>>> samples
['Sample_A', 'Sample_D', 'Sample_E']

While i'm taking samples to preserve the column from it as follows it works but at the same time it produce warning ..

>>> df3 = df2.loc[:, samples]
>>> df3
   Sample_A  Sample_D  Sample_E
0         0         0       NaN
1         1         0       NaN
2         0         1       NaN
3         0         1       NaN
4         1         0       NaN

Warnings:

indexing.py:1472: FutureWarning:
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike
  return self._getitem_tuple(key)

Would like to know about to handle this to a better way!

like image 318
Karn Kumar Avatar asked Mar 06 '23 07:03

Karn Kumar


1 Answers

Use reindex like:

df3 = df2.reindex(columns=samples)
print (df3)
   Sample_A  Sample_D  Sample_E
0         0         0       NaN
1         1         0       NaN
2         0         1       NaN
3         0         1       NaN
4         1         0       NaN

Or if want only intersected columns use Index.intersection:

df3 = df2[df2.columns.intersection(samples)]
#alternative
#df3 = df2[np.intersect1d(df2.columns, samples)]
print (df3)
   Sample_A  Sample_D
0         0         0
1         1         0
2         0         1
3         0         1
4         1         0
like image 96
jezrael Avatar answered Mar 19 '23 23:03

jezrael