亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何為每個組的列中的順序分配一個值基礎?

如何為每個組的列中的順序分配一個值基礎?

夢里花落0921 2023-07-18 17:48:54
我有以下數據,End1、End2 處的值按順序出現,我想要另一列來確定它在 End1 處出現的順序。End2 處的值有可能永遠不會到達 End1 處,但如果它出現在任何地方,都會對下一項的順序產生影響。ID   End1   End2  1    A      B      1    A      B      1    B      A     1    A      B1    C      B1    C      D1    D      C1    C      D1    D      C2    A      B2    A      B2    A      C2    A      C2    C      A2    C      A2    D      C2    C      D2    D      C我想要有以下輸出:ID   End1   End2  Order1    A      B      11    A      B      11    B      A      2     1    A      B      11    C      B      3 1    C      D      31    D      C      41    C      D      31    D      C      42    A      B      12    A      B      12    A      C      12    A      C      1 2    C      A      32    C      A      32    D      C      42    C      D      32    D      C      4我嘗試了不同的函數,但它們都在計算該值的出現次數。任何幫助表示贊賞。更新:這里還有另外兩個要求:每個組的順序都會重置。雖然 A 在 ID=1 時可能具有階數 1,但對于任何其他 ID,它可能具有階數 2。一些建議的解決方案沒有考慮到 End2 處的項目(對于 ID=2 中的 B)可能永遠不會到達 End1。但它會影響其后的項目的順序。為了更清楚地說明 ID=3 在同一數據集中可能有以下數據:ID End1 End22  D    C  .....  3  B    E 3  E    B3  E    B3  G    B3  C    B所需的輸出是ID End1 End2 Order2  D    C    4 .....  3  B    E    13  E    B    23  E    B    2 3  G    B    33  C    B    4
查看完整描述

3 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

將索引設置為ID并使用DataFrame.stack來重塑框架,然后使用Series.factorize創建一個標識不同值的數字數組,從而創建一個系列s,然后使用Series.groupbyons和agg使用first(因為我們必須首先優先考慮列的順序End1End2


s = pd.Series(df.set_index('ID').stack().factorize()[0] + 1)

df['Order'] = s.groupby(s.index // 2).first()

編輯:如果我們需要考慮每組的不同值:


s = pd.Series(np.hstack([g.factorize()[0] + 1 for _, g in

? ? ? ? ? ? ? ? ? ? ? ? ?df.set_index('ID').stack().groupby(level=0)]))

df['Order'] = s.groupby(s.index // 2).first()

結果:


? ? ID End1 End2? Order

0? ? 1? ? A? ? B? ? ? 1

1? ? 1? ? A? ? B? ? ? 1

2? ? 1? ? B? ? A? ? ? 2

3? ? 1? ? A? ? B? ? ? 1

4? ? 1? ? C? ? B? ? ? 3

5? ? 1? ? C? ? D? ? ? 3

6? ? 1? ? D? ? C? ? ? 4

7? ? 1? ? C? ? D? ? ? 3

8? ? 1? ? D? ? C? ? ? 4

9? ? 2? ? A? ? B? ? ? 1

10? ?2? ? A? ? B? ? ? 1

11? ?2? ? A? ? C? ? ? 1

12? ?2? ? A? ? C? ? ? 1

13? ?2? ? C? ? A? ? ? 3

14? ?2? ? C? ? A? ? ? 3

15? ?2? ? D? ? C? ? ? 4

16? ?2? ? C? ? D? ? ? 3

17? ?2? ? D? ? C? ? ? 4


查看完整回答
反對 回復 2023-07-18
?
LEATH

TA貢獻1936條經驗 獲得超7個贊

import pandas as pd

df = pd.DataFrame({'ID': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 2, 10: 2, 11: 2, 12: 2, 13: 2, 14: 2, 15: 2, 16: 2, 17: 2},

                   'End1': {0: 'A', 1: 'A', 2: 'B', 3: 'A', 4: 'C', 5: 'C', 6: 'D', 7: 'C', 8: 'D', 9: 'A', 10: 'A', 11: 'A', 12: 'A', 13: 'C', 14: 'C', 15: 'D', 16: 'C', 17: 'D'},

                   'End2': {0: 'B', 1: 'B', 2: 'A', 3: 'B', 4: 'B', 5: 'D', 6: 'C', 7: 'D', 8: 'C', 9: 'B', 10: 'B', 11: 'C', 12: 'C', 13: 'A', 14: 'A', 15: 'C', 16: 'D', 17: 'C'}})

pandas.unique將給出出現的順序。


sequence查找該列的每個值的索引End1。分組依據'ID'因此順序是唯一的'ID'。堆疊每個組/數據幀可以使列變平['End1','End2']。


df = df.set_index('ID')

gb = df.groupby('ID')

for k,g in gb:

    sequence = pd.unique(g.stack())

    order = (g.End1.to_numpy() == sequence[:,None]).argmax(0) + 1        

    df.loc[k,'Order'] = order

df.Order = df.Order.astype(int)    

def f(g):

    sequence = pd.unique(g.stack())

    order = (g.End1.to_numpy() == sequence[:,None]).argmax(0) + 1

    return order

gb = df.groupby('ID')

orders = gb.apply(f)

df.loc[orders.index,'foo'] = np.concatenate(orders.values)


查看完整回答
反對 回復 2023-07-18
?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊

一種可能的方法是連接 End1+End2 中的字符串值,并將結果用作字典的鍵。該算法看起來像:


counter = 1

new_column = []

my_dict = dict()

for row in data:

  key_to_check = row[End1]+row[End2]

  if key_to_check in my_dict:

     new_column.append(my_dict[key_to_check])

  else:

     my_dict[key_to_check] = counter

     new_column.append(my_dict[key_to_check])

  counter += 1


## append new_column to the data


查看完整回答
反對 回復 2023-07-18
  • 3 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號