![](/img/trans.png)
[英]How to group rows based on specific value in a row and another column in pandas?
[英]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.transform
用any
(如果有的話該組中的行是紅色)和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'})
使用where
將non-'Red'
任何non-'Red'
df.Color
為NaN
並通過df.product
; 然后, transform
與first
和replace
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
與從Product
和Color
的掩碼創建的字典一起使用,並將此dict映射到Product
並replace
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.