@ciel_tktk

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pandasで値が同じ文字列を持つ行を結合する方法

Q&A

Closed

解決したいこと

同じIDを持つ複数の行を一つの行にまとめてデータフレームを作成したいです。

例)

list1=[['1a','NRT','ICN'], ['1b','HND','LAX'], ['1a','ICN','LAX'], ['1c','OSA','NRT'], ['1d','NRT','LAX'], ['1c','NRT','LAX']]
index1 = ["Row1", "Row2", "Row3","Row1", "Row2", "Row3"]
columns1 =["Key", "Origin", "Destination"]
pd.DataFrame(data=list1,  columns=columns1)

image.png

Key列が同じ値の行を新たな列として横に追加したいのですが、良い方法はありませんでしょうか。

データフレームを作成したいです。
image.png

自分で試したこと

df.groupby(['Key']).apply(lambda x: x.sum())など試したのですが、欲しい結果が得られない状況です。ご教授頂きたいです。

0 likes

2Answer

Keyが同じかつDestination = Originのもので結合するイメージであっていますでしょうか?
であれば、mergeを利用して複数キーで外部結合してあげれば実現できそうです。

new_df = pd.merge(df, df, how="left", left_on=['Key', 'Destination'], right_on=['Key', 'Origin'])

image.png

2Like

Comments

  1. @ciel_tktk

    Questioner

    ありがとうございます。Mergeの使い方を理解していなかったので、こんな風に結合できるんですね!
    ちなみに、結合した行だけを残す、または結合した元の行を削除するには別の方法で行を特定して消すしかないでしょうか?

    今回の場合、行2番の1a、ICN,LAXと行5番の1c、NRT LAXを取り除く場合です。

ちなみに、結合した行だけを残す、または結合した元の行を削除するには別の方法で行を特定して消すしかないでしょうか?

そうですねー、mergeしたあと該当行を削除するか、
そもそもmergeを使わず、該当行がなければ追加、あれば更新みたいな処理もありかと思います。

new_df = pd.DataFrame(columns=["Key", "Origin", "Destination","Origin_","Destination_"])
    
for index, row in df.iterrows():
    if len(new_df) == 0:
        new_df = new_df.append(row, ignore_index = True)
        continue
      
    if ((new_df["Key"] == row["Key"]) & (new_df["Destination"] == row["Origin"])).sum() == 0:
        new_df = new_df.append(row, ignore_index = True)
    else:
        new_df.loc[(new_df["Key"] == row["Key"]) & (new_df["Destination"] == row["Origin"]), ["Origin_", "Destination_"]]  = [row["Origin"], row["Destination"]]

image.png

もっときれいな書き方がありそうなものですが、現状私の力の限りを尽くした結果このような形になりました。

1Like

Comments

  1. @ciel_tktk

    Questioner

    ありがとうございます。この様な処理の方法もあるんですね。
    まだまだ勉強不足ですが、すごく参考になりました!!!

Your answer might help someone💌