2017-03-10 5 views
1

私はデータフレームパンダ:除算データフレームいくつかの部分に

ID url 
111 vk.com 
111 facebook.com 
111 twitter.com 
111 avito.ru 
111 apple.com 
111 tiffany.com 
111 pikabu.ru 
111 stackoverflow.com 
222 vk.com 
222 facebook.com 
222 vc.ru 
222 twitter.com 

を持っているが、私は4部にID、次の除算それをデータフレームをGROUPBYすべき新しい列partを、追加する必要があります。 欲望出力

ID url part 
111 vk.com 1 
111 facebook.com 1 
111 twitter.com 2 
111 avito.ru 2 
111 apple.com 3 
111 tiffany.com 3 
111 pikabu.ru 4 
111 stackoverflow.com 4 
222 vk.com 1 
222 facebook.com 2 
222 vc.ru 3 
222 twitter.com 4 

は私が

df.groupby(['ID']).agg({'ID': np.sum/4}).rename(columns={'ID': 'part'}).reset_index() 

を試してみました。しかし、私はそれで

+0

は、すべてのIDグループは、ウィル常に4の倍数ですか? – pshep123

+0

@ pshep123はい、私は4つの部分に分割する必要があります –

答えて

1

を望ましく得ることはありませんあなたはnumpy.repeatgroupbyを使用することができます。

df['part'] = df.groupby('ID')['ID'] 
       .apply(lambda x: pd.Series(np.repeat(np.arange(1, 5), (len(x.index)/4)))) 
       .reset_index(drop=True) 
print (df) 
    ID    url part 
0 111    vk.com  1 
1 111  facebook.com  1 
2 111  twitter.com  2 
3 111   avito.ru  2 
4 111   apple.com  3 
5 111  tiffany.com  3 
6 111   pikabu.ru  4 
7 111 stackoverflow.com  4 
8 222    vk.com  1 
9 222  facebook.com  2 
10 222    vc.ru  3 
11 222  twitter.com  4 

カスタムのもう一つの解決策を関数:

def f(x): 
    #print (x) 
    x['part'] = np.repeat(np.arange(1, 5), (len(x.index)/4)) 
    return x 

df = df.groupby('ID').apply(f) 
print (df) 
    ID    url part 
0 111    vk.com  1 
1 111  facebook.com  1 
2 111  twitter.com  2 
3 111   avito.ru  2 
4 111   apple.com  3 
5 111  tiffany.com  3 
6 111   pikabu.ru  4 
7 111 stackoverflow.com  4 
8 222    vk.com  1 
9 222  facebook.com  2 
10 222    vc.ru  3 
11 222  twitter.com  4 

グループは4のgetエラーで割るれていない場合は、次の

ValueError: Length of values does not match length of index

一つの可能​​な解決策は、4で除算fo0r値を追加し、最後dropnaして削除します:

print (df) 
    ID   url 
0 111  vk.com 
1 111  avito.ru 
2 111  apple.com 
3 111 tiffany.com 
4 111  pikabu.ru 
5 222  vk.com 
6 222 facebook.com 
7 222 twitter.com 

def f(x): 
    a = len(x.index) % 4 
    if a != 0: 
     x = pd.concat([x, pd.DataFrame(index = np.arange(4-a))]) 

    x['part'] = np.repeat(np.arange(1, 5), (len(x.index)/4)) 
    return x 

df = df.groupby('ID').apply(f).dropna(subset=['ID']).reset_index(drop=True) 
#if necessary convert to int 
df.ID = df.ID.astype(int) 
print (df) 
    ID   url part 
0 111  vk.com  1 
1 111  avito.ru  1 
2 111  apple.com  2 
3 111 tiffany.com  2 
4 111  pikabu.ru  3 
5 222  vk.com  1 
6 222 facebook.com  2 
7 222 twitter.com  3 
+0

なぜNaNを返すことができますか? –

+0

私は確信していませんが、別の解決策があなたの実際のデータでうまくいくかもしれません。これをチェックしてください。 – jezrael

+0

'df = df.groupby( 'ID')の' ValueError:値の長さがインデックスの長さと一致しません 'を返すapply(f)' –

関連する問題