データフレームにプレフィックス/サフィックスを追加するには、通常、次のようにします。
たとえば、接尾辞_'@'
_を追加するには、
_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)
_
ただし、これは機能しません。空のデータフレームを提供します。
私が見逃している本当に基本的なものはありますか?
Applymapを使用して、文字列メソッドを各要素に適用できます。
df = df.applymap(lambda x: str(x).rstrip('@'))
注:これがベクトル化されたアプローチほど高速であるとは思いません:pd.Series.str.rstrip
つまり、各列を個別に変換します
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']]
これは、pandas
loc
またはiloc
ベースの割り当てに類似しています。
これを本当に簡単にして、 pandas.DataFrame.replace() メソッドを使用してすべての「@」を「」に置き換えることができます。
df.replace("@", "")
値の最後だけでなく「@」が置き換えられることを心配している場合は、正規表現を使用できます。
df.replace("@$", "", regex=True)