2017-01-04 104 views
0

我有一個數據幀與names = ['id','t','metric_1','metric_2','metric_3']。我正在對每個grp in groupby('id')進行一些信號處理。我需要扭轉整個數據框中正在處理的另一個進程的時間,並在進行底層處理。簡單地說,給定一個grp,我只需要反轉時間列,使所有其他列保持不變,並且所有行不在grp中。熊貓數據幀反向排序使用groupby子集

輸入數據幀:

id t metric_1 metric_2 metric_3 
0 0 86 13.333 61.989 0.017444 
1 0 87 13.333 61.993 0.017569 
2 0 88 13.333 61.992 0.017711 
3 0 89 13.333 61.998 0.017746 
4 0 90 13.333 61.993 0.017871 
5 1 32 13.333 61.964 0.018511 
6 1 33 20.000 61.913 0.020058 
7 1 34 20.000 61.864 0.022475 
8 1 35 26.667 61.802 0.025995 
9 1 36 33.123 61.563 0.032345 
10 1 37 33.763 61.836 0.060189 
11 2 2 13.333 61.964 0.018511 
12 2 3 20.000 61.613 0.020058 
13 2 4 20.000 61.164 0.027475 
14 2 5 26.667 61.802 0.024995 
15 2 6 33.333 61.736 0.030689 

我想用能產生這樣的數據幀的操作:

id t metric_1 metric_2 metric_3 
0 0 90 13.333 61.989 0.017444 
1 0 89 13.333 61.993 0.017569 
2 0 88 13.333 61.992 0.017711 
3 0 87 13.333 61.998 0.017746 
4 0 86 13.333 61.993 0.017871 
5 1 37 13.333 61.964 0.018511 
6 1 36 20.000 61.913 0.020058 
7 1 35 20.000 61.864 0.022475 
8 1 34 26.667 61.802 0.025995 
9 1 33 33.333 61.736 0.030689 
10 1 32 33.763 61.836 0.060189 
11 2 6 13.333 61.964 0.018511 
12 2 5 20.000 61.613 0.020058 
13 2 4 20.000 61.164 0.027475 
14 2 3 26.667 61.802 0.024995 
15 2 2 33.333 61.736 0.030689 
+0

現在我完全困惑 - 你想排序/更改't'列中的值('id == 1')還是不? – MaxU

+0

是的。數據幀的ID從0到n,其中n是一個整數。對於每個n,我想要反轉相應的't'值。每個'id'可能有不同數量的't'值,所以需要爲每個'id'完成。 – superhero

回答

4

UPDATE2:排序/在t替換列值,但只對於那些行id == 0as described in this comment):

In [373]: df 
Out[373]: 
    id t metric_1 metric_2 metric_3 
0 0 86 13.333 61.989 0.017444 
1 0 87 13.333 61.993 0.017569 
2 0 88 13.333 61.992 0.017711 
3 0 89 13.333 61.998 0.017746 
4 0 90 13.333 61.993 0.017871 
5 1 86 13.333 61.964 0.018511 
6 1 87 20.000 61.913 0.020058 
7 1 88 20.000 61.864 0.022475 
8 1 89 26.667 61.802 0.025995 
9 1 90 33.333 61.736 0.030689 

In [374]: df.loc[df.id == 0, 't'] = df.loc[df.id == 0, 't'].sort_values(ascending=0).values 

In [375]: df 
Out[375]: 
    id t metric_1 metric_2 metric_3 
0 0 90 13.333 61.989 0.017444 
1 0 89 13.333 61.993 0.017569 
2 0 88 13.333 61.992 0.017711 
3 0 87 13.333 61.998 0.017746 
4 0 86 13.333 61.993 0.017871 
5 1 86 13.333 61.964 0.018511 
6 1 87 20.000 61.913 0.020058 
7 1 88 20.000 61.864 0.022475 
8 1 89 26.667 61.802 0.025995 
9 1 90 33.333 61.736 0.030689 

UPDATE:更新的數據集

原始DF:

In [363]: df 
Out[363]: 
    id t metric_1 metric_2 metric_3 
0 0 86 13.333 61.989 0.017444 
1 0 87 13.333 61.993 0.017569 
2 0 88 13.333 61.992 0.017711 
3 0 89 13.333 61.998 0.017746 
4 0 90 13.333 61.993 0.017871 
5 1 86 13.333 61.964 0.018511 
6 1 87 20.000 61.913 0.020058 
7 1 88 20.000 61.864 0.022475 
8 1 89 26.667 61.802 0.025995 
9 1 90 33.333 61.736 0.030689 

排序完整行:

In [364]: df.sort_values(['id','t'], ascending=[1,0]) 
Out[364]: 
    id t metric_1 metric_2 metric_3 
4 0 90 13.333 61.993 0.017871 
3 0 89 13.333 61.998 0.017746 
2 0 88 13.333 61.992 0.017711 
1 0 87 13.333 61.993 0.017569 
0 0 86 13.333 61.989 0.017444 
9 1 90 33.333 61.736 0.030689 
8 1 89 26.667 61.802 0.025995 
7 1 88 20.000 61.864 0.022475 
6 1 87 20.000 61.913 0.020058 
5 1 86 13.333 61.964 0.018511 # <-- 

爲兩列(['id','t'])排序的值,替換它們的值:

In [366]: df[['id','t']] = df[['id','t']].sort_values(['id','t'], ascending=[1,0]).values 

In [367]: df 
Out[367]: 
    id t metric_1 metric_2 metric_3 
0 0 90 13.333 61.989 0.017444 
1 0 89 13.333 61.993 0.017569 
2 0 88 13.333 61.992 0.017711 
3 0 87 13.333 61.998 0.017746 
4 0 86 13.333 61.993 0.017871 
5 1 90 13.333 61.964 0.018511 
6 1 89 20.000 61.913 0.020058 
7 1 88 20.000 61.864 0.022475 
8 1 87 26.667 61.802 0.025995 
9 1 86 33.333 61.736 0.030689 # <-- 

OLD答案:

IIUC你可以簡單排序的數據由兩列:

In [349]: df.sort_values(['id','t'], ascending=[1,1]) 
Out[349]: 
    id t metric_1 metric_2 metric_3 
4 0 86 13.333 61.993 0.017871 
3 0 87 13.333 61.998 0.017746 
2 0 88 13.333 61.992 0.017711 
1 0 89 13.333 61.993 0.017569 
0 0 90 13.333 61.989 0.017444 
9 1 86 33.333 61.736 0.030689 
8 1 87 26.667 61.802 0.025995 
7 1 88 20.000 61.864 0.022475 
6 1 89 20.000 61.913 0.020058 
5 1 90 13.333 61.964 0.018511 
,如果你想將它分類爲您所需的數據集

(更換t列值):

In [357]: df[['id','t']] = df[['id','t']].sort_values(['id','t']).values 

In [358]: df 
Out[358]: 
    id t metric_1 metric_2 metric_3 
0 0 86 13.333 61.989 0.017444 
1 0 87 13.333 61.993 0.017569 
2 0 88 13.333 61.992 0.017711 
3 0 89 13.333 61.998 0.017746 
4 0 90 13.333 61.993 0.017871 
5 1 86 13.333 61.964 0.018511 
6 1 87 20.000 61.913 0.020058 
7 1 88 20.000 61.864 0.022475 
8 1 89 26.667 61.802 0.025995 
9 1 90 33.333 61.736 0.030689 # 1 90 33.333 61.736 0.030689 as in your desired DF 
+0

對不起@MaxU,我在那裏有錯誤的數據框。我做了一些編輯。 – superhero

+0

@superhero,你想只排序't'列值或完整的行嗎?我的意思是,這是我的第一個解決方案還是第二個解決方案? – MaxU

+0

只有't',但是作爲'id'的函數。所以,考慮到子集「id == 0」,我想顛倒「t」列,使其讀取降序而不是升序,但保留所有其他列原樣,並保留其他所有其他行,其中'id!= 0'原樣。然後,對所有子組做同樣的事情,比如'groupby('id')' – superhero

0

如果要扭轉「T」欄留下的所有其它列完整,你可以試試下面的代碼:

df.t=df['t'].sort_values(ascending=False) 
+0

沒錯,但它更復雜。我想爲每個「id」反轉「t」。每個'id'對應於一次持續n秒的實驗,其中n每次都不相同。如果我只是將't'列倒過來,那麼時間值顯然會與他們的'id'恩人不匹配。 – superhero