簡體   English   中英

根據其他行的條件填充 dataframe 行

[英]Fill rows of dataframe based on condition of other row

我有一個像這樣的 dataframe:

pd.DataFrame({"ID1": ["A", "B", "C", "A", "C", "C", "A"],
              "ID2": ["a", "b", "c", "a", "e", "c", "b"],
              "Month": [1, 4, 7, 4, 2, 9, 3],
              "Value": [10, 20, 40, 60, 20, 30, 10]})
ID1 ID2  Month  Value
A   a      1     10
B   b      4     20
C   c      7     40
A   a      4     60
C   e      2     20
C   c      9     30
A   b      3     10

我想用“ID1”+“ID2”組合的前一個月的值填充缺失月份的值,即:組合“A”+“的第 2 個月和第 3 個月沒有值” a”,所以它應該取第 1 個月的值。在第 4 個月,我們有一個值“A”+“a”,所以這個值應該取到一個月的另一個值。

對於組合“C”+“c”,值應從第 7 個月開始出現,因為它是組合出現的第一個值。

末端 dataframe 應如下所示:

ID1 ID2  Month  Value
A   a      1     10
A   a      2     10
A   a      3     10
A   a      4     60
A   a      5     60
A   a      6     60
A   a      7     60
A   a      8     60
A   a      9     60
A   a      10    60
A   a      11    60
A   a      12    60
B   b      4     20
C   c      1     0
C   c      2     0
C   c      3     0
C   c      4     0
C   c      5     0
C   c      6     0
C   c      7     40
C   c      8     40
C   c      9     30
C   c      10    30
C   c      11    30
C   c      12    30
... ...    ...   ...

我開始我的方法有點低效(我猜):

  1. 循環數月 1:12

  2. 循環遍歷“ID1”+“ID2”的唯一組合

  3. 如果存在“ID1”+“ID2”和月份的行

    然后go到下個月

  4. 其他看前一個月的“ID1”+“ID2”組合

    如果值存在

    然后取值

    否則將值設為 0

有沒有更好的方法來做到這一點,或者 package 可以幫助我有效地計算這個?

定義以下 function 來處理每個組:

def proc(grp):
    wrk = grp.set_index('Month').Value.reindex(np.arange(1, 13).tolist())\
        .ffill().fillna(0, downcast='infer')
    id1, id2 = grp.iloc[0, :2].tolist()
    wrk.index = pd.MultiIndex.from_product([[id1], [id2], wrk.index],
        names=['ID1', 'ID2', 'Month'])
    return wrk

然后,為了獲得您的預期結果,將dfID1ID2分組並應用上述 function:

result = df.groupby(['ID1', 'ID2'], group_keys=False).apply(proc).reset_index()

最后一步是reset_index()將生成的(連接的)系列轉換為 DataFrame。

('A', 'a')('C', 'c')的結果片段是:

   ID1 ID2  Month  Value
0    A   a      1     10
1    A   a      2     10
2    A   a      3     10
3    A   a      4     60
4    A   a      5     60
5    A   a      6     60
6    A   a      7     60
7    A   a      8     60
8    A   a      9     60
9    A   a     10     60
10   A   a     11     60
11   A   a     12     60
...
36   C   c      1      0
37   C   c      2      0
38   C   c      3      0
39   C   c      4      0
40   C   c      5      0
41   C   c      6      0
42   C   c      7     40
43   C   c      8     40
44   C   c      9     30
45   C   c     10     30
46   C   c     11     30
47   C   c     12     30

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM