我有以下数据框,我想在其中重新创建列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()
答案 0 :(得分:3)
我们可以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
输出
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)
使用where
将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
的掩码创建的字典一起使用,并将此字典映射到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