[英]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
列中都使用交替值填充等於零的值,但是僅當這些觀察值“夾在”其他觀察值之間且age
和age
中至少有一個非零值age
,才可以moved
列。
例如,在上面的組中,我想填寫行798914: 798918
,而不是798908:798911
..對於age
和moved
值均等於0的觀測值,我編寫了一個函數,該函數相應地替換了零。 但我想在“三明治”情況下(例如798914: 798918
調用此函數,並且不知道如何訪問這些行。
到目前為止,我已經嘗試過類似的方法:
group.loc[(group["age"] == 0) & (group["moved"] == 0), ['age', 'moved']] = someFunction(group)
但這填充了非夾心的觀測值,如上述組中的前四行。 我應該如何應用一個函數來填充age
和每個組中等於0的moved
值,但僅適用於夾在age
, moved
或兩者中具有非零值的觀測值之間的觀測值?
假設中的值age
和moved
都是非負的,你可以選擇使用需要的行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.