组中每行的熊猫条件列值

时间:2019-12-11 00:34:04

标签: python-3.x pandas numpy conditional-statements pandas-groupby

我在熊猫的条件栏上也提出了类似的问题,但是在处理新发行的书时有点卡住了。示例数据集如下:

   Name     Date         Type      Currency
0  John  *2017-07-06  BTC              USD   
1  John  *2017-07-06  Paypal           USD    
2  John  *2017-07-06  Fastspring       USD  
3  John   2017-07-10  EU               EUR  
4  John   2017-07-10  PayPal           USD   
5  John   2017-07-10  PayPal           USD 
6  John  *2017-07-12  BTC              EUR    
7  John  *2017-07-12  Fastspring       USD  
8  Susan  2017-07-06  EU               EUR   - Dates Restart Again on Susan
9  Susan  2017-07-06  PayPal           USD    
10 Susan  2017-07-10  BTC              USD    
11 Susan  2017-07-12  PayPal           USD    

我试图添加一个条件列,每个包含“ BTC”的日期在名为“覆盖”的新列中具有匹配日期的行中产生一个“是”值,所需的输出如下:

   Name     Date         Type      Currency   Covered
0  John  *2017-07-06  BTC              USD    Yes*
1  John  *2017-07-06  Paypal           USD    Yes*
2  John  *2017-07-06  Fastspring       USD    Yes*
3  John   2017-07-10  EU               EUR    No
4  John   2017-07-10  PayPal           USD    No
5  John   2017-07-10  PayPal           USD    No
6  John  *2017-07-12  BTC              EUR    Yes*
7  John  *2017-07-12  Fastspring       USD    Yes*
8  Susan  2017-07-06  EU               EUR    No    - Dates Restart Again on Susan
9  Susan  2017-07-06  PayPal           USD    No
10 Susan  2017-07-10  BTC              USD    Yes*
11 Susan  2017-07-12  PayPal           USD    No

我首先使用groupby和isin按日期分组:-更新代码-感谢@Quang Hoang非常接近解决问题,只需要用每个新名称重设即可。

df['Covered'] = np.where(df['Type'].eq('BTC')
                            .groupby(df['Date'])
                            .transform('any'), 
                         'Yes', 'No')

但是我仍然只为包含“ BTC”的特定行生成值,而不是为每个日期组包含“ BTC”的值生成所有行,就像我想要的输出一样。

有什么建议吗?我在这里需要作出任何澄清,谢谢所有能提供帮助的人。

1 个答案:

答案 0 :(得分:1)

您可以先检查Type是否为BTC并使用groupby().transform

df['Covered'] = np.where(df['Type'].eq('BTC')
                            .groupby(df['Date'])
                            .transform('any'),    # 'max' also works
                         'Yes', 'No')

输出:

         Date        Type Currency Covered
0  2017-07-06         BTC      USD     Yes
1  2017-07-06      Paypal      USD     Yes
2  2017-07-06  Fastspring      USD     Yes
3  2017-07-10          EU      EUR      No
4  2017-07-10      PayPal      USD      No
5  2017-07-10      PayPal      USD      No
6  2017-07-12         BTC      EUR     Yes
7  2017-07-12  Fastspring      USD     Yes
8  2017-07-14          EU      EUR      No
9  2017-07-14      PayPal      USD      No