熊猫:如何根据特定的行值将值应用于一组行?

时间:2019-08-05 21:31:47

标签: python pandas

我有以下数据框,我想在其中重新创建列To Show?。这个想法是,如果“产品”组在任何行的Red列中的值为Color,那么我希望To Show?列的所有行的值为Yes Product A。对于没有值为Red的任何产品组,我希望该列的值为No

   Year  Week Product   Color To Show?
0  2019    21       A   Green      Yes
1  2019    22       A   Green      Yes
2  2019    23       A     Red      Yes
3  2019    24       A   Green      Yes
4  2019    25       C   Green       No
5  2019    26       C  Yellow       No
6  2019    27       C   Green       No
7  2019    28       B   Green      Yes
8  2019    29       B     Red      Yes
9  2019    30       B  Yellow      Yes
import pandas as pd

data = {
    'Year': [2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019],
    'Week': [21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
    'Product': ['A', 'A', 'A', 'A', 'C', 'C', 'C', 'B', 'B', 'B'],
    'Color': ['Green', 'Green', 'Red', 'Green', 'Green', 'Yellow', 'Green', 'Green', 'Red', 'Yellow'],
    'To Show?': ['Yes', 'Yes', 'Yes', 'Yes', 'No', 'No', 'No', 'Yes', 'Yes', 'Yes']
}

df = pd.DataFrame(data)

我尝试使用唯一的,但不确定如何解析Series并基于该赋值吗?

df1 = df.groupby('Product')['Color'].unique()

3 个答案:

答案 0 :(得分:3)

我们可以Groupby.transformany(如果组中的任何行为红色)和np.where m = df.groupby('Product')['Color'].transform(lambda x: x.eq('Red').any()) df['To Show?'] = np.where(m, 'Yes', 'No') 一起有条件地创建新列:

   Year  Week Product   Color To Show?
0  2019    21       A   Green      Yes
1  2019    22       A   Green      Yes
2  2019    23       A     Red      Yes
3  2019    24       A   Green      Yes
4  2019    25       C   Green       No
5  2019    26       C  Yellow       No
6  2019    27       C   Green       No
7  2019    28       B   Green      Yes
8  2019    29       B     Red      Yes
9  2019    30       B  Yellow      Yes

输出

android:largeHeap="true"

答案 1 :(得分:2)

使用transform广播结果,并使用map将其制作为Yes/No

df['To Show?'] = df.groupby('Product').Color\
                                      .transform(lambda x: x.eq('Red').any())\
                                      .map({True: 'Yes', False: 'No'})

答案 2 :(得分:1)

使用wherenon-'Red'中的任何df.Color翻转到NaN并按df.product分组;然后,transformfirstreplace

df['To Show?'] =  (df.Color.where(df.Color.eq('Red'))
                           .groupby(df.Product)
                           .transform('first') 
                           .replace(['Red', np.nan], ['Yes', 'No']))

Out[364]:
   Year  Week Product   Color To Show?
0  2019    21       A   Green      Yes
1  2019    22       A   Green      Yes
2  2019    23       A     Red      Yes
3  2019    24       A   Green      Yes
4  2019    25       C   Green       No
5  2019    26       C  Yellow       No
6  2019    27       C   Green       No
7  2019    28       B   Green      Yes
8  2019    29       B     Red      Yes
9  2019    30       B  Yellow      Yes

或者您可以将map与从ProductColor的掩码创建的字典一起使用,并将此字典映射到Productreplace

d = dict(df.loc[df.Color.eq('Red'), ['Product', 'Color']].values)

Out[375]: {'A': 'Red', 'B': 'Red'}

df['To Show?'] = df.Product.map(d).replace(['Red', np.nan], ['Yes', 'No'])

Out[379]:
   Year  Week Product   Color To Show?
0  2019    21       A   Green      Yes
1  2019    22       A   Green      Yes
2  2019    23       A     Red      Yes
3  2019    24       A   Green      Yes
4  2019    25       C   Green       No
5  2019    26       C  Yellow       No
6  2019    27       C   Green       No
7  2019    28       B   Green      Yes
8  2019    29       B     Red      Yes
9  2019    30       B  Yellow      Yes