インデックスとして設定された2つの列「sp」と「bg」を持ち、「スコア」でソートされたデータフレームがあります。データフレームの「sp」値ごとに上位2行を取得したい
df = pd.DataFrame([
{'sp': 'A', 'bg': 'a', 'score': 1234},
{'sp': 'A', 'bg': 'b', 'score': 123},
{'sp': 'A', 'bg': 'c', 'score': 12},
{'sp': 'A', 'bg': 'd', 'score': 1},
{'sp': 'B', 'bg': 'a', 'score': 234},
{'sp': 'B', 'bg': 'b', 'score': 23},
{'sp': 'C', 'bg': 'a', 'score': 345},
{'sp': 'C', 'bg': 'b', 'score': 34},
{'sp': 'C', 'bg': 'c', 'score': 3},
])
df.set_index(['sp', 'bg'], inplace=True)
出力はデータフレームである必要があります。
df = pd.DataFrame([
{'sp': 'A', 'bg': 'a', 'score': 1234},
{'sp': 'A', 'bg': 'b', 'score': 123},
{'sp': 'B', 'bg': 'a', 'score': 234},
{'sp': 'B', 'bg': 'b', 'score': 23},
{'sp': 'C', 'bg': 'a', 'score': 345},
{'sp': 'C', 'bg': 'b', 'score': 34},
])
df.set_index(['sp', 'bg'], inplace=True)
これでうまくいくはずです:
import pandas as pd
df = pd.DataFrame([
{'sp': 'A', 'bg': 'a', 'score': 1234},
{'sp': 'A', 'bg': 'b', 'score': 123},
{'sp': 'A', 'bg': 'c', 'score': 12},
{'sp': 'A', 'bg': 'd', 'score': 1},
{'sp': 'B', 'bg': 'a', 'score': 234},
{'sp': 'B', 'bg': 'b', 'score': 23},
{'sp': 'C', 'bg': 'a', 'score': 345},
{'sp': 'C', 'bg': 'b', 'score': 34},
{'sp': 'C', 'bg': 'c', 'score': 3},
])
df.set_index(['sp', 'bg'], inplace=True)
df = pd.DataFrame(df.groupby('sp').score.nlargest(2)).droplevel(0)
print(df)
その出力は次のとおりです。
score
sp bg
A a 1234
b 123
B a 234
b 23
C a 345
b 34
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加