2013-03-12 67 views
1

可以將新的索引分別應用於DF,用groupby進行分組嗎?準確地說 - 是否有一個優雅的方式來做到這一點,並可以通過groupby組改變原來的DF?pandas.DataFrame - 如何按組重新索引?

UPD: 我的數據是這樣的:

A B   C 
0 a x 0.903343 
1 a z 0.982050 
2 g x 0.274823 
3 g y 0.334491 
4 c z 0.756728 
5 f z 0.697841 
6 d z 0.505845 
7 b z 0.768199 
8 b y 0.743012 
9 e x 0.697212 

我按列「A」和「B」的分組,我想,每一個獨特的對那個值的列將在相同的索引值原來的DF。另外 - 原始的DF可能很大,我試圖想象如何製作這樣的重新索引而沒有低效率地形成全新的DF。使用

目前即時通訊這個解決方案:

創建測試數據幀第一:

import pandas as pd 
import random 
random.seed(1) 
df = pd.DataFrame({'A': [random.choice(ascii_lowercase[:5]) for _ in xrange(10)], 
        'B': [random.choice(['x', 'y']) for _ in xrange(10)], 
        'C': [random.random() for _ in xrange(10)]}) 

如果你想在新的

df = pd.DataFrame({'A': [random.choice(ascii_lowercase[:5]) for _ in xrange(10)], 
        'B': [random.choice(['x', 'y']) for _ in xrange(10)], 
        'C': [random.random() for _ in xrange(10)]}) 

df['id'] = None 
new_df = pd.DataFrame() 
for i, (n, g) in enumerate(df.groupby(['A', 'B'])): 
    g['id'] = i 
    new_df = new_df.append(g) 

new_df.set_index('id', inplace=True) 
+0

這將是,如果你方便的提供了一些樣本數據。 – 2013-03-12 15:51:23

+0

此外,您可以在這裏澄清一些含糊之處。你想修改組名嗎?組內選定的行索引?如果你可以展示一個開始的df,一個groupby,以及你試圖完成的那種馴服,那將會很有幫助。 – 2013-03-12 15:59:43

+0

如果我理解正確,看起來您嘗試爲列A和列B的每個組合創建具有唯一值的整數索引。除非因特定原因需要整數索引,否則可以簡單地使用列A和B創建MultiIndex與'df.set_index([「A」,「B」])。sort()'這將允許你做所有相同的選擇和切片整數索引將使用'xs'和'ix'。例如:'df.ix [「a」]。ix [「y」]'或'df.xs(key =「x」,level = 1)'。 – bdiamante 2013-03-12 21:19:09

回答

0

您可以在熊貓內部的一些功能很快做到這一點id與列A相同的順序A & B:

m = pd.MultiIndex.from_arrays((df.A, df.B)) 
df.index = pd.factorize(pd.lib.fast_zip(m.labels), sort=True)[0] 
print df 

輸出是:

A B   C 
1 a y 0.025446 
7 e x 0.541412 
6 d y 0.939149 
2 b x 0.381204 
3 c x 0.216599 
4 c y 0.422117 
5 d x 0.029041 
6 d y 0.221692 
1 a y 0.437888 
0 a x 0.495812 

如果你不關心新的ID的順序:

m = pd.MultiIndex.from_arrays((df.A, df.B)) 
la, lb = m.labels 
df.index = pd.factorize(la*len(lb)+lb)[0] 
print df 

輸出是:

A B   C 
0 a y 0.025446 
1 e x 0.541412 
2 d y 0.939149 
3 b x 0.381204 
4 c x 0.216599 
5 c y 0.422117 
6 d x 0.029041 
2 d y 0.221692 
0 a y 0.437888 
7 a x 0.495812