「data.csv」という名前の次のファイルがあります。
1997,Ford,E350
1997, Ford , E350
1997,Ford,E350,"Super, luxurious truck"
1997,Ford,E350,"Super ""luxurious"" truck"
1997,Ford,E350," Super luxurious truck "
"1997",Ford,E350
1997,Ford,E350
2000,Mercury,Cougar
そして、これをpandas DataFrameに解析して、DataFrameが次のようになるようにします。
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
私ができる最善のことは:
pd.read_table("data.csv", sep=r',', names=["Year", "Make", "Model", "Description"])
私を取得します:
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
これらの空白なしでDataFrameを取得するにはどうすればよいですか?
コンバーターを使用できます:
import pandas as pd
def strip(text):
try:
return text.strip()
except AttributeError:
return text
def make_int(text):
return int(text.strip('" '))
table = pd.read_table("data.csv", sep=r',',
names=["Year", "Make", "Model", "Description"],
converters = {'Description' : strip,
'Model' : strip,
'Make' : strip,
'Year' : make_int})
print(table)
利回り
Year Make Model Description
0 1997 Ford E350 None
1 1997 Ford E350 None
2 1997 Ford E350 Super, luxurious truck
3 1997 Ford E350 Super "luxurious" truck
4 1997 Ford E350 Super luxurious truck
5 1997 Ford E350 None
6 1997 Ford E350 None
7 2000 Mercury Cougar None
さて、空白はデータ内にあるため、空白を読み取らないとデータを読み取ることができません。ただし、それを読み込んだ後、たとえばdf["Make"] = df["Make"].map(str.strip)
(ここで、df
はデータフレームです)を実行することにより、空白を取り除くことができます。
パラメーター_skipinitialspace=True
_を _read_table
_ に追加すると、うまくいきました。
だから試してください:
_pd.read_table("data.csv",
sep=r',',
names=["Year", "Make", "Model", "Description"],
skipinitialspace=True)
_
同じことがpd.read_csv()
でも機能します。
コメントを残すのに十分な評判はありませんが、map
関数とstrip
を一緒に使用することを提案する上記の答えは、NaN値がある場合は機能しません。 NaNはfloatです。
これを行うための組み込みのpandas関数があります。これを使用しました:pd.core.strings.str_strip(df['Description'])
ここで、df
はデータフレームです。私の場合、約120万行のデータフレームで使用しましたが、非常に高速でした。
この質問が投稿された時点でPandasがこれをサポートしていたとは思いませんが、これを行う最も簡単な方法はread_csv
のsep
パラメーターで正規表現を使用することです。したがって、この問題には次のようなものが機能するはずです。
table = pd.read_table("data.csv", sep=' *, *')
Str.strip()関数はSeriesで非常にうまく機能します。したがって、空白を含むデータフレーム列をSeriesに変換し、str.strip()関数を使用して空白を削除し、変換された列をデータフレームに戻します。以下にコード例を示します。
import pandas as pd
data = pd.DataFrame({'values': [' ABC ', ' DEF', ' GHI ']})
new = pd.Series([])
new = data['values'].str.strip()
data['values'] = new
各列を反復処理してpd.core.strings.str_strip
を適用する関数を次に示します。
def df_strip(df):
df = df.copy()
for c in df.columns:
if df[c].dtype == np.object:
df[c] = pd.core.strings.str_strip(df[c])
df = df.rename(columns={c:c.strip()})
return df
read_table isDeprecated、これはドキュメントに表示されるメッセージです。
バージョン0.24.0から非推奨。
代わりに pandas.read_csv() を使用し、必要に応じてsep = '\ t'を渡します。
read_csvを使用すると、sep
引数の正規表現を渡すことができます。
sep="\s*,\s*"
任意の数のスペースとそれに続くセパレータ、さらに任意の数のスペース、これにより、先頭と末尾のスペースもすべて選択されますデータの両側の空白を順番に削除する区切りチャンク。
次の正規表現の詳細:
\s -> white-space
* -> any number (zero or many)
, -> no meaning, direct character match
したがって、正規表現\s*,\s*
を意味する white-space[any number] match a comma and white-space[any number]
。
区切り文字がコンマ以外の場合は、,
区切り文字付きの上記の式で。例:\s*;\s*
if ;
は区切り文字です。