web-dev-qa-db-ja.com

Pandasでcsvファイルを解析するときに文字列から余分な空白を削除するにはどうすればよいですか?

「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を取得するにはどうすればよいですか?

43
mpjan

コンバーターを使用できます:

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
47
unutbu

さて、空白はデータ内にあるため、空白を読み取らないとデータを読み取ることができません。ただし、それを読み込んだ後、たとえばdf["Make"] = df["Make"].map(str.strip)(ここで、dfはデータフレームです)を実行することにより、空白を取り除くことができます。

26
BrenBarn

パラメーター_skipinitialspace=True_を _read_table_ に追加すると、うまくいきました。

だから試してください:

_pd.read_table("data.csv", 
              sep=r',', 
              names=["Year", "Make", "Model", "Description"], 
              skipinitialspace=True)
_

同じことがpd.read_csv()でも機能します。

22

コメントを残すのに十分な評判はありませんが、map関数とstripを一緒に使用することを提案する上記の答えは、NaN値がある場合は機能しません。 NaNはfloatです。

これを行うための組み込みのpandas関数があります。これを使用しました:pd.core.strings.str_strip(df['Description'])
ここで、dfはデータフレームです。私の場合、約120万行のデータフレームで使用しましたが、非常に高速でした。

9
RKD314

この質問が投稿された時点でPandasがこれをサポートしていたとは思いませんが、これを行う最も簡単な方法はread_csvsepパラメーターで正規表現を使用することです。したがって、この問題には次のようなものが機能するはずです。

table = pd.read_table("data.csv", sep=' *, *')
7
Hunter Jackson

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
2
S. Herron

各列を反復処理して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
2
J Wang

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 ;は区切り文字です。

0
Rajshekar Reddy