Home > Back-end >  When transforming a list of tuples to dataframes is there a way to keep the integers integers?
When transforming a list of tuples to dataframes is there a way to keep the integers integers?

Time:11-24

If I have a list like this

lista=[(0.11838, 0.1926, 0.12071, 0.27438, -0.0253, -0.18799, 0.01544, 0.24514, 0.19905, 0.18563, 0.19999, 0.25336, 783, 783, 783, 783), (nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan), (nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan), (0.11838, 0.1926, 0.12071, 0.27438, -0.0253, -0.18799, 0.01544, 0.24514, 0.19905, 0.18563, 0.19999, 0.25336, 783, 783, 783, 783), (nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan), (nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan), (0.11838, 0.1926, 0.12071, 0.27438, -0.0253, -0.18799, 0.01544, 0.24514, 0.19905, 0.18563, 0.19999, 0.25336, 783, 783, 783, 783), (nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan)]

is there a way that when transforming them into dataframes the integers (783) does not get transformed into floats?

Now I get this

pd.DataFrame(lista)
        0       1        2        3       4        5        6        7        8        9        10       11     12     13     14     15
0  0.11838  0.1926  0.12071  0.27438 -0.0253 -0.18799  0.01544  0.24514  0.19905  0.18563  0.19999  0.25336  783.0  783.0  783.0  783.0
1      NaN     NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN    NaN    NaN    NaN    NaN
2      NaN     NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN    NaN    NaN    NaN    NaN
3  0.11838  0.1926  0.12071  0.27438 -0.0253 -0.18799  0.01544  0.24514  0.19905  0.18563  0.19999  0.25336  783.0  783.0  783.0  783.0
4      NaN     NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN    NaN    NaN    NaN    NaN
5      NaN     NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN    NaN    NaN    NaN    NaN
6  0.11838  0.1926  0.12071  0.27438 -0.0253 -0.18799  0.01544  0.24514  0.19905  0.18563  0.19999  0.25336  783.0  783.0  783.0  783.0
7      NaN     NaN      NaN      NaN     NaN      NaN      NaN      NaN      NaN      NaN      NaN      NaN    NaN    NaN    NaN    NaN

CodePudding user response:

A pandas column has a data type that fits all values in that column. If you want to manually set columns data types, use this

convert_dict = {'c1': int,
                'c2': float
               } # c1 and c2 are example columns here

df = df.astype(convert_dict)

CodePudding user response:

Use DataFrame.convert_dtypes:

df = pd.DataFrame(lista).convert_dtypes()
print (df)
        0       1        2        3       4        5        6        7   \
0  0.11838  0.1926  0.12071  0.27438 -0.0253 -0.18799  0.01544  0.24514   
1     <NA>    <NA>     <NA>     <NA>    <NA>     <NA>     <NA>     <NA>   
2     <NA>    <NA>     <NA>     <NA>    <NA>     <NA>     <NA>     <NA>   
3  0.11838  0.1926  0.12071  0.27438 -0.0253 -0.18799  0.01544  0.24514   
4     <NA>    <NA>     <NA>     <NA>    <NA>     <NA>     <NA>     <NA>   
5     <NA>    <NA>     <NA>     <NA>    <NA>     <NA>     <NA>     <NA>   
6  0.11838  0.1926  0.12071  0.27438 -0.0253 -0.18799  0.01544  0.24514   
7     <NA>    <NA>     <NA>     <NA>    <NA>     <NA>     <NA>     <NA>   

        8        9        10       11    12    13    14    15  
0  0.19905  0.18563  0.19999  0.25336   783   783   783   783  
1     <NA>     <NA>     <NA>     <NA>  <NA>  <NA>  <NA>  <NA>  
2     <NA>     <NA>     <NA>     <NA>  <NA>  <NA>  <NA>  <NA>  
3  0.19905  0.18563  0.19999  0.25336   783   783   783   783  
4     <NA>     <NA>     <NA>     <NA>  <NA>  <NA>  <NA>  <NA>  
5     <NA>     <NA>     <NA>     <NA>  <NA>  <NA>  <NA>  <NA>  
6  0.19905  0.18563  0.19999  0.25336   783   783   783   783  
7     <NA>     <NA>     <NA>     <NA>  <NA>  <NA>  <NA>  <NA>  

Another idea if always only integers and missing values per columns:

df = pd.DataFrame(lista)

m = df.apply(lambda x: x.dropna().astype(int).eq(x)).any()

df.loc[:, m] = df.loc[:, m].astype('Int64')
print (df)
        0       1        2        3       4        5        6        7   \
0  0.11838  0.1926  0.12071  0.27438 -0.0253 -0.18799  0.01544  0.24514   
1      NaN     NaN      NaN      NaN     NaN      NaN      NaN      NaN   
2      NaN     NaN      NaN      NaN     NaN      NaN      NaN      NaN   
3  0.11838  0.1926  0.12071  0.27438 -0.0253 -0.18799  0.01544  0.24514   
4      NaN     NaN      NaN      NaN     NaN      NaN      NaN      NaN   
5      NaN     NaN      NaN      NaN     NaN      NaN      NaN      NaN   
6  0.11838  0.1926  0.12071  0.27438 -0.0253 -0.18799  0.01544  0.24514   
7      NaN     NaN      NaN      NaN     NaN      NaN      NaN      NaN   

        8        9        10       11    12    13    14    15  
0  0.19905  0.18563  0.19999  0.25336   783   783   783   783  
1      NaN      NaN      NaN      NaN  <NA>  <NA>  <NA>  <NA>  
2      NaN      NaN      NaN      NaN  <NA>  <NA>  <NA>  <NA>  
3  0.19905  0.18563  0.19999  0.25336   783   783   783   783  
4      NaN      NaN      NaN      NaN  <NA>  <NA>  <NA>  <NA>  
5      NaN      NaN      NaN      NaN  <NA>  <NA>  <NA>  <NA>  
6  0.19905  0.18563  0.19999  0.25336   783   783   783   783  
7      NaN      NaN      NaN      NaN  <NA>  <NA>  <NA>  <NA>  
  • Related