目次
問題の導入
まず、図 1 に示すように、csv ファイルの内容を確認します。
図1
csvファイルの「b」列にはint型とfloat型の両方があることがわかります。
まずコードの一部を見てみましょう。
from pandas import read_csv
df=read_csv('test.csv')
print(df)
印刷結果を図 1 に示します。
図2
図 2 からわかるように、列 "b" のデータは float 型のみで、int 型はありません。次に、DataFrame オブジェクトをリスト オブジェクトに変換します。コードは次のとおりです。
from pandas import read_csv
df=read_csv('test.csv')
df_list=df.values.tolist()
print(df_list)
印刷結果を図 3 に示します。
画像3
図 3 からわかるように、すべての数値が float 型になりました。ここで問題があり、データ型が間違っているのですが、3列目はint型ですが、ndarrayに変換するとfloat型になってしまいます。もちろん、csv ファイルを読み取る際にも型の変換が強制されますが、この問題についてはここでは説明しません。
考える
ソース コードから、「values」属性の戻り値 ndarray 型が図 4 に示されていることがわかります。
図4
次に、コード スニペットを見てみましょう。
import numpy as np
arr=np.array([[1.0,2],[2,3]])
print(arr)
印刷結果を図 5 に示します。
図5
図 5 と前のコードから、型変換を強制しなくても、ndarray に変換できるデータ型に float データが含まれている場合、ndarray 全体のデータ型が float 型に変換されるという結論を大胆に導き出すことができます。
value 属性と tolist メソッドを使用して DataFrame オブジェクトをリストに変換するのは簡単で、必要なコードは 1 行だけですが、DataFrame オブジェクトのデータ全体に float 型がある場合、他の列も強制的に変換されます。 。
解決する
したがって、作者はこのDataFrameの「属性」の値に問題があると考えています。もちろん使えます。
著者は完璧な解決策を見つけられなかったので、より面倒な方法を使用しました。コードは以下のように表示されます。
from pandas import read_csv
from pandas.core.frame import DataFrame
def DataFrame2list(df:DataFrame)->list:
df_list=[]
for row in range(df.shape[0]): # df.shape[0] 获得总行数
col_list=[]
for col in range(df.shape[1]): # df.shape[1] 获得总列数
col_list.append(df.iat[row,col]) # iat 一个一个取值
df_list.append(col_list)
return df_list
df=read_csv('test.csv')
df_list=DataFrame2list(df)
print(df_list)
上記のコードは 2 番目のループであり、非常に面倒です。この問題を解決する別の方法を知っている方がいらっしゃいましたら、コメント エリアにメッセージを残してください。印刷結果を図 6 に示します。