【问题标题】:Conditional Column Values In Pandas For Each Row in Group组中每一行的 Pandas 条件列值
【发布时间】:2020-04-04 05:38:45
【问题描述】:

我在 pandas 中的条件列上问了一个类似的问题,但在处理一个新问题时有点卡住了。示例数据集如下:

   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”的日期在名为“Covered”的新列中与匹配日期的行中产生一个“是”值,所需的输出如下:

   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”值的所有行。

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 我刚刚运行了这个,它似乎工作得很好,并且完全涵盖了我想要实现的目标,非常感谢 Quang Hoang!只是一个简单的问题,我大部分都了解脚本,除了 .transform('any') 或 max 之外,如果可能的话,你能为我解释一下吗?再次感谢!
    • 简而言之,transformapply 相似,只是它对组中的每一行返回相同的值,而 apply 则相反,每个组返回一个值。
    • 那些单项日期不会有问题。您可以像在代码中一样替换 .eq('BTC') with .isin(select_type_codes )`。
    • @SlimJim 只需将名称添加到 groupby,即groupby([df['Name'], df['Date']])
    • 不,应该是np.where(df['Type'].isin(['BTC', 'PayPal'])...
    猜你喜欢
    • 2018-03-19
    • 2020-06-22
    • 2021-07-17
    • 2015-07-22
    • 2019-08-05
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多