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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

556閲覧

Pandasで順序のあるジャンルデータを加工してそれぞれの学者の名前にジャンル名をつけたいです。

cts01_bear

総合スコア1

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/07/24 09:40

前提・実現したいこと

もしご存じでしたらお教えください。実行環境はwindows 10 Prof上で動作するPython 3.7 + Pandas 1.0.5です。AnacondaのSpyderで動かしています。df_aからdf_bのデータに変換したいのですが、
どうpandasを書いてよいのかわからなくなってしまいました。

以下のようなdf_aを持っています。
df_a DataFrame:

col_1 col_2 col_3 col_4

0 start genre_start sociology none
1 pos_1 Auguste Comte aa none
2 pos_2 Durkheim ab none
3 pos_3 Marx ac none
4 pos_4 Spencer ad end_of_cat
5 start genre_start history none
6 pos_1 Cato the Elder db none
7 pos_2 David Hume db none
8 pos_3 Richard L. Hills fh end_of_cat
9 start genre_start mathmatics none
10 pos_1 John von Neumann fd none
11 pos_2 John Nash ge end_of_cat

上のデータを以下のようにdf_bにしたいと思っております。

df_b DataFrame

col_1 col_3 col_6

0 pos_1 Auguste Comte sociology
1 pos_2 Durkheim sociology
2 pos_3 Marx sociology
3 pos_4 Spencer sociology
4 pos_1 Cato the Elder history
5 pos_2 David Hume history
6 pos_3 Richard L. Hills history
7 pos_1 John von Neumann mathmatics
8 pos_2 John Nash mathmatics

###加工ルール
A. df_aからdf_bの加工には以下のルールがあります。
Col_1にはstart, col_4にend_of_catがあり、col3にジャンル(SociologyやHistoryなど)が
あれば、start からend_of_catの間のcol_2(Augste ComteやDurkheimなどの名前)にはジャンルが名
をつけたいです。

B. ジャンル名(Sociology, Historyなどは不特定多数です。

c. 名前(Auguste ComteやJohn Nash)などは不特定多数です。

該当のソースコード(df_a及びdf_bのサンプルデータ)

#df_a
df_a = pd.DataFrame ({'col_1':['start','pos_1','pos_2','pos_3','pos_4','start','pos_1','pos_2','pos_3','start','pos_1','pos_2'],
'col_2':['genre_start','Auguste Comte','Durkheim','Marx','Spencer','genre_start','Cato the Elder','David Hume','Richard L. Hills','genre_start','John von Neumann','John Nash'],
'col_3':['sociology','aa','ab','ac','ad','history','db','db','fh','mathmatics','fd','ge'],
'col_4':['none','none','none','none','end_of_cat','none','none','none','end_of_cat','none','none','end_of_cat']},
index = [0,1,2,3,4,5,6,7,8,9,10,11])

#df_b
df_b = pd.DataFrame({'col_1':['pos_1','pos_2','pos_3','pos_4','pos_1','pos_2','pos_3','pos_1','pos_2'],
'col_3':['Auguste Comte','Durkheim','Marx','Spencer','Cato the Elder','David Hume','Richard L. Hills','John von Neumann','John Nash'],
'col_6':['sociology','sociology','sociology','sociology','history','history','history','mathmatics','mathmatics']},
index = [0,1,2,3,4,5,6,7,8])

試したこと

最初はList化してトライしましたが、訳が分からなくなりました。
DataFrame化したのですが、シーケンス型のようになってしまい、余計に難しくなってしまいました。

補足情報(FW/ツールのバージョンなど)

OS: windows 10 Prof
Anaconda: Python 3.7 + Pandas 1.0.5
IDE: Spyder

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のようにしてはいかがでしょうか。

python

1start_indices = df.index[df["col_1"] == "start"] 2end_indices = df.index[df["col_4"] == "end_of_cat"] 3 4for start, end in zip(start_indices, end_indices): 5 name = df.loc[start, "col_3"] # 名前を取り出す 6 df.loc[start + 1 : end, "col_6"] = name # 名前を設定する 7 8ret = df.loc[df["col_1"] != "start", ["col_1", "col_2", "col_6"]] 9ret
col_1col_2col_6
1pos_1Auguste Comtesociology
2pos_2Durkheimsociology
3pos_3Marxsociology
4pos_4Spencersociology
6pos_1Cato the Elderhistory
7pos_2David Humehistory
8pos_3Richard L. Hillshistory
10pos_1John von Neumannmathmatics
11pos_2John Nashmathmatics

投稿2020/07/24 10:15

編集2020/07/24 10:16
tiitoi

総合スコア21956

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

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

cts01_bear

2020/07/24 10:24

目からうろこでした!修行します。どうもありがとうございました。Listでごちゃごちゃして混乱したあと、どうしようかと思ってました。Pythonはまだ2週間しかいじってないので、修行します。どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問