[英]Replacing values based on multiple column values and conditions in pandas dataframe
[英]Replacing values in column based on conditions in pandas DataFrame
我在熊貓 DataFrame 中有以下數據:
import pandas as pd
df = pd.read_csv('example_data_file.csv')
df.head()
ID Year status
223725 1991 No
223725 1992 No
223725 1993 No
223725 1994 No
223725 1995 No
我想在列替換值status
,其值Yes
和No
基於以下條件的ID:如果ID
至少有一個Yes
在列status
,那么所有意見(包括No
列) status
特定於該ID
被替換為Yes
。 否則,它保持不變。
例如,在下面的 DataFrame 中, 844272365
在最后一行的status
中具有Yes
,那么特定於844272365
那些行中status
中的所有先前觀察都應替換為Yes
。
ID Year status
844272365 1991 No
844272365 1992 No
844272365 1993 No
844272365 1994 No
844272365 1995 No
844272365 1996 No
844272365 1997 No
844272365 1998 No
844272365 1999 No
844272365 2000 No
844272365 2001 No
844272365 2002 No
844272365 2003 No
844272365 2004 No
844272365 2005 No
844272365 2006 No
844272365 2007 No
844272365 2008 No
844272365 2010 No
844272365 2011 No
844272365 2012 No
844272365 2013 Yes
如何根據上述條件對 DataFrame 中的多個 ID 進行這些替換?
您可以使用transform
:
df['new_status'] = (df
.groupby('ID')['status']
.transform(lambda x: 'Yes' if x.str.contains('Yes').any() else 'No'))
用max
檢查transform
'Yes'>'No' # this is the reason why max work
Out[433]: True
df['new_status'] = df.groupby('ID')['status'].transform('max')
df
Out[435]:
ID Year status new_status
0 844272365 1991 No Yes
1 844272365 1992 No Yes
2 844272365 1993 No Yes
3 844272365 1994 No Yes
4 844272365 1995 No Yes
5 844272365 1996 No Yes
6 844272365 1997 No Yes
7 844272365 1998 No Yes
8 844272365 1999 No Yes
9 844272365 2000 No Yes
10 844272365 2001 No Yes
11 844272365 2002 No Yes
12 844272365 2003 No Yes
13 844272365 2004 No Yes
14 844272365 2005 No Yes
15 844272365 2006 No Yes
16 844272365 2007 No Yes
17 844272365 2008 No Yes
18 844272365 2010 No Yes
19 844272365 2011 No Yes
20 844272365 2012 No Yes
21 844272365 2013 Yes Yes
以下應該工作:
s=set(df[df.status=='Yes']['ID'])
for i in range(len(df)):
if df.ID.iloc[i] in s:
df.status[i]='Yes'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.