web-dev-qa-db-ja.com

pandasデータフレーム:データフレーム全体のすべてのセル値からプレフィックス/サフィックスを追加および削除します

データフレームにプレフィックス/サフィックスを追加するには、通常、次のようにします。

たとえば、接尾辞_'@'_を追加するには、

_df = df.astype(str) + '@'
_

これにより、基本的にすべてのセル値に_'@'_が追加されました。

このサフィックスを削除する方法を知りたいのですが。 DataFrame全体から特定のプレフィックス/サフィックス文字を削除する、pandas.DataFrameクラスで直接使用できるメソッドはありますか?

次のようにrstrip('@')を使用しながら、行を(シリーズとして)反復してみました。

_for index in range(df.shape[0]):
    row = df.iloc[index]
    row = row.str.rstrip('@')
_

さて、このシリーズからデータフレームを作るために、

_new_df = pd.DataFrame(columns=list(df))
new_df = new_df.append(row)
_

ただし、これは機能しません。空のデータフレームを提供します。

私が見逃している本当に基本的なものはありますか?

8
murphy1310

Applymapを使用して、文字列メソッドを各要素に適用できます。

df = df.applymap(lambda x: str(x).rstrip('@'))

注:これがベクトル化されたアプローチほど高速であるとは思いません:pd.Series.str.rstripつまり、各列を個別に変換します

4
AlexG

Pd.Seriesのapplyおよびstr.stripメソッドを使用できます。

In [13]: df
Out[13]:
       a       b      c
0    dog   quick    the
1   lazy    lazy    fox
2  brown   quick    dog
3  quick     the   over
4  brown    over   lazy
5    fox   brown  quick
6  quick     fox    the
7    dog  jumped    the
8   lazy   brown    the
9    dog    lazy    the

In [14]: df = df + "@"

In [15]: df
Out[15]:
        a        b       c
0    dog@   quick@    the@
1   lazy@    lazy@    fox@
2  brown@   quick@    dog@
3  quick@     the@   over@
4  brown@    over@   lazy@
5    fox@   brown@  quick@
6  quick@     fox@    the@
7    dog@  jumped@    the@
8   lazy@   brown@    the@
9    dog@    lazy@    the@

In [16]: df = df.apply(lambda S:S.str.strip('@'))

In [17]: df
Out[17]:
       a       b      c
0    dog   quick    the
1   lazy    lazy    fox
2  brown   quick    dog
3  quick     the   over
4  brown    over   lazy
5    fox   brown  quick
6  quick     fox    the
7    dog  jumped    the
8   lazy   brown    the
9    dog    lazy    the

Forループで次の割り当てを行うと、アプローチが機能しないことに注意してください。

row = row.str.rstrip('@')

これは、rowを変更せずに、row.str.stripの結果を名前DataFrameに割り当てるだけです。これは、すべてのpythonオブジェクトと単純な名前の割り当てで同じ動作です:

In [18]: rows = [[1,2,3],[4,5,6],[7,8,9]]

In [19]: print(rows)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [20]: for row in rows:
    ...:     row = ['look','at','me']
    ...:

In [21]: print(rows)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

基になるデータ構造を実際に変更するには、ミューテーターメソッドを使用する必要があります。

In [22]: rows
Out[22]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [23]: for row in rows:
    ...:     row.append("LOOKATME")
    ...:

In [24]: rows
Out[24]: [[1, 2, 3, 'LOOKATME'], [4, 5, 6, 'LOOKATME'], [7, 8, 9, 'LOOKATME']]

スライス代入は、ミューテーターメソッドの単なる構文糖衣であることに注意してください。

In [26]: rows
Out[26]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [27]: for row in rows:
    ...:     row[:] = ['look','at','me']
    ...:
    ...:

In [28]: rows
Out[28]: [['look', 'at', 'me'], ['look', 'at', 'me'], ['look', 'at', 'me']]

これは、pandaslocまたはilocベースの割り当てに類似しています。

5

これを本当に簡単にして、 pandas.DataFrame.replace() メソッドを使用してすべての「@」を「」に置き換えることができます。

df.replace("@", "")

値の最後だけでなく「@」が置き換えられることを心配している場合は、正規表現を使用できます。

df.replace("@$", "", regex=True) 
1
SummerEla