簡體   English   中英

根據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 ,其值YesNo基於以下條件的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.

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