簡體   English   中英

Python Pandas:替換groupby對象中的選擇值

[英]Python pandas: replace select values in groupby object

我有一個很大的數據框,其中包含四列的個人級別數據:一個人的身分證件號碼,她的年齡,她的年齡和她的移動狀態。 我對存儲在unique_pid2列中的人員ID號使用groupby

import pandas as pd 

gr_data = pd.read_csv("M:/test.csv").groupby('unique_pid2')

group = gr_data.get_group('5904_181')

print group

每個組如下所示:

       unique_pid2  year  age  moved
798908    5904_181  1983    0      0
798909    5904_181  1984    0      0
798910    5904_181  1985    0      0
798911    5904_181  1986    0      0
798912    5904_181  1987    2      5
798913    5904_181  1988    0      5
798914    5904_181  1989    0      0
798915    5904_181  1990    0      0
798916    5904_181  1991    0      0
798917    5904_181  1992    0      0
798918    5904_181  1993    0      0
798928    5904_181  2009   24      5
798929    5904_181  2011   26      1

對於每個組,我都希望在“ moved和“ age列中都使用交替值填充等於零的值,但是僅當這些觀察值“夾在”其他觀察值之間且ageage中至少有一個非零值age ,才可以moved列。

例如,在上面的組中,我想填寫行798914: 798918 ,而不是798908:798911 ..對於agemoved值均等於0的觀測值,我編寫了一個函數,該函數相應地替換了零。 但我想在“三明治”情況下(例如798914: 798918調用此函數,並且不知道如何訪問這些行。

到目前為止,我已經嘗試過類似的方法:

group.loc[(group["age"] == 0) & (group["moved"] == 0), ['age', 'moved']] = someFunction(group)

但這填充了非夾心的觀測值,如上述組中的前四行。 我應該如何應用一個函數來填充age和每個組中等於0的moved值,但僅適用於夾在agemoved或兩者中具有非零值的觀測值之間的觀測值?

假設中的值agemoved都是非負的,你可以選擇使用需要的行cumsum

mask = ((grp['age'].cumsum()>0) & (grp['moved'].cumsum()>0)
        & (grp['age'] == 0) & (grp['moved'] == 0))

因為當累計總和大於0時,必須有一個在前的正值。

例如,

import pandas as pd

df = pd.read_csv("M:/test.csv")
gr_data = df.groupby('unique_pid2')
def foo(grp):
    mask = ((grp['age'].cumsum()>0) & (grp['moved'].cumsum()>0)
            & (grp['age'] == 0) & (grp['moved'] == 0))
    grp.loc[mask, ['age', 'moved']] = 'foo'
    return grp
df = gr_data.apply(foo)
print(df)

產量

   unique_pid2  year  age moved
0     5904_181  1983    0     0
1     5904_181  1984    0     0
2     5904_181  1985    0     0
3     5904_181  1986    0     0
4     5904_181  1987    2     5
5     5904_181  1988    0     5
6     5904_181  1989  foo   foo
7     5904_181  1990  foo   foo
8     5904_181  1991  foo   foo
9     5904_181  1992  foo   foo
10    5904_181  1993  foo   foo
11    5904_181  2009   24     5
12    5904_181  2011   26     1

暫無
暫無

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

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