Python Pandas在具有重复值的单元格上添加条件

时间:2015-05-26 02:58:15

标签: python pandas group-by

这是我之前提问propagating values over non-unique (duplicate) cells in pandas

的后续内容

我有一个DataFrame:

import pandas as pd

df = pd.DataFrame({'First': ['Sam', 'Greg', 'Steve', 'Sam',
                             'Jill', 'Bill', 'Nod', 'Mallory', 'Ping', 'Lamar'],
                   'Last': ['Stevens', 'Hamcunning', 'Strange', 'Stevens',
                            'Vargas', 'Simon', 'Purple', 'Green', 'Simon', 'Simon'],
                   'Address': ['112 Fake St',
                               '13 Crest St',
                               '14 Main St',
                               '112 Fake St',
                               '2 Morningwood',
                               '7 Cotton Dr',
                               '14 Main St',
                               '20 Main St',
                               '7 Cotton Dr',
                               '7 Cotton Dr'],
                   'Status': ['Infected', '', 'Infected', '', '', '', '','', '', 'Infected'],
                   'Level': [10, 2, 7, 5, 2, 10, 10, 20, 1, 1],
                   })

让我们说这次我希望将状态值'infected'传播给同一地址中的每个人,并附加一个条件,例如它们在Last中具有相同的值。 结果如下:

df2 = df1.copy(deep=True)
df2['Status'] = ['Infected', '', 'Infected', 'Infected', '', 'Infected', '', '', 'Infected', 'Infected']

如果他在同一地址但不是同一级别,我希望个人被标记为感染该怎么办?结果将是:

df3 = df1.copy(deep=True)
df3['Status'] = ['Infected', '', 'Infected', '', '', 'Infected', '', '', '', 'Infected']

我该怎么做?这是一个群体问题吗?

1 个答案:

答案 0 :(得分:0)

"同一地址"表示为" groupby"。

import pandas as pd


df=pd.DataFrame({'First': [ 'Sam', 'Greg', 'Steve', 'Sam',
                 'Jill', 'Bill', 'Nod', 'Mallory', 'Ping', 'Lamar'],
                 'Last': [ 'Stevens', 'Hamcunning', 'Strange', 'Stevens',
                 'Vargas', 'Simon', 'Purple', 'Green', 'Simon', 'Simon'],
                 'Address': ['112 Fake St','13 Crest St','14 Main St','112 Fake St','2 Morningwood','7 Cotton Dr','14 Main St','20 Main St','7 Cotton Dr','7 Cotton Dr'],
                 'Status': ['Infected','','Infected','','','','','','','Infected'],
                 'Level': [10,2,7,5,2,10,10,20,1,1],
                 })

df2_index = df.groupby(['Address', 'Last']).filter(lambda x: (x['Status'] == 'Infected').any()).index
df2 = df.copy()
df2.loc[df2_index, 'Status'] = 'Infected'

df3_status = df.groupby('Address', as_index=False, group_keys=False).apply(lambda x: pd.Series(list('Infected' if (row['Status'] == 'Infected') or ((x['Status'] == 'Infected') & (x['Level'] != row['Level'])).any() else '' for _, row in x.iterrows()), index=x.index))
df3 = df.copy()
df3['Status'] = df3_status