1

我在 pandas 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具有值YesNoID:如果列ID中至少有一个,则特定于该列的所有观察值(包括)都将替换为。否则,它保持不变。YesstatusNostatusIDYes

例如,在下面的 DataFrame 中,在最后一行中844272365Yesin ,那么那些特定于 的行中的所有先前观察都应该替换为.statusstatus844272365Yes

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 进行这些替换?

4

3 回答 3

1

您可以使用transform

df['new_status'] = (df
                    .groupby('ID')['status']
                    .transform(lambda x: 'Yes' if x.str.contains('Yes').any() else 'No'))
于 2020-09-03T17:44:37.340 回答
1

检查transformmax

'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
于 2020-09-03T17:47:25.123 回答
0

以下应该有效:

s=set(df[df.status=='Yes']['ID'])
for i in range(len(df)):
    if df.ID.iloc[i] in s:
        df.status[i]='Yes'
于 2020-09-03T17:40:59.983 回答