相关文章推荐
df1 = pd.DataFrame({'Name': ['A0', 'A1', 'A2', 'A3', 'A4'],
                    'Buy': [True, True, False, False, False],
                    'Sell': [False, False, True, False, True]
                   index=[0, 1, 2, 3, 4])
    Name    Buy Sell
0   A0  True    False
1   A1  True    False
2   A2  False   True
3   A3  False   False
4   A4  False   True

我想在一个条件下合并买入和卖出列,如果 "买入 "为真值,则为 "买方",如果 "卖出 "为真值,则为 "卖方",如果 "买入 "和 "卖出 "都为假值,则为 "非"。

sample required output
    Name    Type 
0   A0      Buyer
1   A1      Buyer
2   A2      Seller
3   A3      NA
4   A4      Seller
    
python
python-3.x
pandas
Parag
Parag
发布于 2020-01-14
2 个回答
piRSquared
piRSquared
发布于 2020-01-14
已采纳
0 人赞同

np.select

a = np.select([df1.Buy, df1.Sell], ['Buyer', 'Seller'], 'NA')
pd.DataFrame({'Name': df1.Name, 'Type': a})
  Name    Type
0   A0   Buyer
1   A1   Buyer
2   A2  Seller
3   A3      NA
4   A4  Seller
df1.assign(Type=np.select([df1.Buy, df1.Sell], ['Buyer', 'Seller'], 'NA'))
  Name    Buy   Sell    Type
0   A0   True  False   Buyer
1   A1   True  False   Buyer
2   A2  False   True  Seller
3   A3  False  False      NA
4   A4  False   True  Seller
    
Any reason you use pd.DataFrame and assign over simply: df['Type'] = np.select([df1.Buy, df1.Sell], ['Buyer', 'Seller'], 'NA')?
@Erfan 是的。 我倾向于提供不改变原始数据框架的答案。 我并不总是这样做......但几乎总是这样做。
Quang Hoang
Quang Hoang
发布于 2020-01-14
0 人赞同

你可以这样做。

s = df[['Buy','Sell']]
df['Type'] = (s@s.columns).add('er').replace('er', np.nan)
# df['Type'] = np.where(s.any(1), s.idxmax(1).add('er'), np.nan)

Output:

  Name    Buy   Sell    Type
0   A0   True  False   Buyer
 
推荐文章