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:
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>