簡體   English   中英

熊貓:如何根據特定的行值將值應用於一組行?

[英]Pandas: How to apply a value to a group of rows based on a specific row value?

我有以下數據框,我想在其中重新創建To Show?的列To Show? 這個想法是,如果“產品”組在任何行的“ Color列中的值為“ Red ,那么我To Show? Product A所有行的值為“ Yes ”的列。 對於沒有值為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()

我們可以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

使用transform廣播結果並map以使其為Yes/No

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

使用wherenon-'Red'任何non-'Red' df.ColorNaN並通過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的掩碼創建的字典一起使用,並將此dict映射到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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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