質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1148閲覧

データフレームの置換

hachiroku

総合スコア21

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/08 01:06

日付ごとにカラムBとCを上下反転させたい

dateABC
2020-08-02102030
2020-08-02101010
2020-08-03202010
2020-08-03505050
...
...
2020-09-02202020
2020-09-02404040

変更後

dateABC
2020-08-02101010
2020-08-02102030
2020-08-03205050
2020-08-03502010
...
...
2020-09-02204040
2020-09-02402020

date
out:
DatetimeIndex(['2020-08-02', '2020-08-03', '2020-08-04', '2020-08-05',
......
'2020-08-30', '2020-08-31', '2020-09-01', '2020-09-02'],

python

1for i in date: 2 df.loc[df['date'] == i, ['B','C']] = df[df['date'] == i ][['B','C']][::-1]

上記のコードで試みましたが置換ができません。
どなたかご教授いただけないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2020/09/08 01:45

同じ日付のデータが、かならず2行ペアになっていて、それぞれのペアでB列のデータを交換、C列のデータを交換したい、ということでいいのでしょうか。
guest

回答2

0

ベストアンサー

for文ではなく、.groupby()メソッドを用いて'B', 'C'列を反転させます。例えば、

python

1df[['B', 'C']] = df.groupby('date')['B', 'C'].transform(lambda s: s[::-1])

もし'date'列がソート済み、かつ全てが2行ずつのグループになっている場合は以下のようにインデックスを用いて反転させるのが容易です。

python

1df['B'][1::2], df['B'][::2] = df['B'][::2].to_list(), df['B'][1::2].to_list() 2df['C'][1::2], df['C'][::2] = df['C'][::2].to_list(), df['C'][1::2].to_list()

python

1df[['B', 'C']] = df[['B', 'C']].to_numpy().reshape(len(df)//2, 2, 2)[:,::-1,:].reshape(len(df),-1)

python

1df[['B', 'C']] = df[['B', 'C']].iloc[np.arange(len(df)).reshape(len(df)//2, 2)[:,::-1].ravel()]

投稿2020/09/08 05:28

kirara0048

総合スコア1399

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hachiroku

2020/09/08 07:07

いくつか例をあげていただいて大変ありがたいです。ありがとうございます。
guest

0

泥臭く、2行読むごとにB列の内容を入れ替え、C列の内容を入れ替えるコード。

Python

1import pandas as pd 2import io 3import sys 4 5txt = """ 6date,A,B,C 72020-08-02,10,20,30 82020-08-02,10,10,10 92020-08-03,20,20,10 102020-08-03,50,50,50 112020-09-02,20,20,20 122020-09-02,40,40,40 13""" 14 15df = pd.read_table(io.StringIO(txt), sep=",", parse_dates=['date']) 16 17row1 = None 18for row2 in df.itertuples(): 19 if row1 is None: 20 row1 = row2 21 continue 22 if row1.date != row2.date: 23 sys.exit(1) 24 #print(row1, row2, sep='\n', end='\n' + '-' * 8 + '\n') 25 df.at[row1.Index, 'B'] = row2.B 26 df.at[row1.Index, 'C'] = row2.C 27 df.at[row2.Index, 'B'] = row1.B 28 df.at[row2.Index, 'C'] = row1.C 29 row1 = None 30 31df.set_index('date', inplace=True) 32print(df)

result

1 A B C 2date 32020-08-02 10 10 10 42020-08-02 10 20 30 52020-08-03 20 50 50 62020-08-03 50 20 10 72020-09-02 20 40 40 82020-09-02 40 20 20

投稿2020/09/08 02:42

編集2020/09/08 03:45
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hachiroku

2020/09/08 07:13

ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問