62

「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 に解析したいと思います。

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

4

9 に答える 9

60

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

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
于 2012-11-14T19:35:40.043 に答える
51

パラメータskipinitialspace=Trueを追加するとread_tableうまくいきました。

だから試してください:

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

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

于 2015-09-21T21:26:27.990 に答える
31

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

于 2012-11-14T19:29:04.327 に答える
13

コメントを残すのに十分な評判はありませんが、ストリップは文字でのみ機能し、NaN は浮動小数点数であるため、NaN 値がある場合は関数を使用することを提案する上記の回答はmap機能しstripません。

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

于 2015-09-15T14:58:36.993 に答える
1

私にとって最良の方法は

def read_csv_regex(data, date_columns=[]):
    df = pd.read_csv(data, quotechar='"', parse_dates=date_columns)

    # remove front and ending blank spaces
    df = df.replace({"^\s*|\s*$":""}, regex=True) 

    # if there remained only empty string "", change to Nan
    df = df.replace({"":np.nan}) 
    return df

コンバーター関数を記述してすべての列に設定する必要はありません。これは、先頭と末尾のスペースで機能し、regexp sep とは異なり、クォータに問題があります。

https://towardsdatascience.com/dealing-with-extra-white-spaces-while-reading-csv-in-pandas-67b0c2b71e6a#9281を参照してください。

于 2021-10-19T21:59:44.500 に答える