2017-02-18 3 views
1

df ["A"]をグループ化し、df ["C"]の最初の2つの最小値に対応するdf ["B"Pandas groupby上位2つの最小値の行を取得するようにソート

df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 
        'foo', 'bar', 'foo', 'foo'], 
        'B': ['cat', 'dog', 'rat', 'lion', 
        'bat', 'racoon', 'possum', 'deer'], 
        'C': [1, 2, 6, 4, 3, 1, 2, 4]}) 

私は結果になりたい:私はあなたが必要だと思う

A B_1  B_2 
0 foo cat  possum 
1 bar racoon dog 
+0

あなたがそれを行うにしようとしたときに何が起こりましたか? – iled

+0

df.groupby( "A") –

+0

の出力方法は正しいですか?それを確認してください。 – jezrael

答えて

2

nsmallest
  • groupby
  • unstack
  • によってリシェイプは
  • add_prefix最後列名に1を追加し、reset_index
df1 = df.set_index('B') 
     .groupby('A', sort=False)['C'] 
     .apply(lambda x: pd.Series(x.nsmallest(2).index)) 
     .unstack() 
df1.columns = df1.columns + 1 
df1 = df1.add_prefix('B_').reset_index() 
print (df1) 
    A  B_1  B_2 
0 foo  cat possum 
1 bar racoon  dog 

1行のソリューション:

df1 = df.set_index('B') 
     .groupby('A', sort=False)['C'] 
     .apply(lambda x: pd.Series(x.nsmallest(2).index, index =['B_1','B_2'])) 
     .unstack() 
     .reset_index() 
print (df1) 
    A  B_1  B_2 
0 foo  cat possum 
1 bar racoon  dog 

EDIT:

それはあまりにも完璧なdatetimeで動作します:

np.random.seed(100) 
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 
        'foo', 'bar', 'foo', 'foo'], 
        'B': ['cat', 'dog', 'rat', 'lion', 
        'bat', 'racoon', 'possum', 'deer'], 
        'C': np.random.choice(pd.date_range('2017-02-18', 
                 periods=8), 
             size=8, replace=False)}) 
print (df) 
    A  B   C 
0 foo  cat 2017-02-19 
1 bar  dog 2017-02-22 
2 foo  rat 2017-02-23 
3 bar lion 2017-02-20 
4 foo  bat 2017-02-24 
5 bar racoon 2017-02-21 
6 foo possum 2017-02-25 
7 foo deer 2017-02-18 

print (df.dtypes) 
A   object 
B   object 
C datetime64[ns] 

df1 = df.set_index('B') 
     .groupby('A', sort=False)['C'] 
     .apply(lambda x: pd.Series(x.nsmallest(2).index, index =['B_1','B_2'])) 
     .unstack() 
     .reset_index() 
print (df1) 
    A B_1  B_2 
0 foo deer  cat 
1 bar lion racoon 
+0

答えをありがとう。それは完全に動作します。列 "C"がdatetimeオブジェクトの場合、どのようにnsmallestを使用しますか? –

+0

私はそれを試して、私に時間を取らなければならない。アイデアはdatetimeをunix時間に変換してから、完璧に動作します。 – jezrael

+0

私はそれを得ました!本当にありがとう。 –

関連する問題