繁体   English   中英

如何计算熊猫中多列的值?

[英]How to count value across multiple columns in pandas?

我有一个与摩托车相关的熊猫数据帧。 数据集有 1000 行和 30 列。

例如,

date motor1 motor2 motor3 vehicle1  vehicle2 reason 
2010 Honda   NaN    NaN    Sedan     NaN        *    
  :
2012 Yamaha  Kymco  NaN    Truck     Sedan      *  
  :
2013 Harley  Kymco  Kymco  Ambulance NaN        *     
  :

我想创建一个新列,以便在没有空值的情况下记录跨列的值。

我期望的输出是:

year motor1 motor2 motor3 vehicle1  vehicle2 reason count
2010 Honda   NaN    NaN    Sedan     NaN        *     2
  :
2012 Yamaha  Kymco  NaN    Truck     Sedan      *     4
  :
2013 Harley  Kymco  Kymco  Ambulance  NaN       *     4
  :

另外,因为数据是按年份排列的,所以我还想设置特定年份的条件,看看该特定年份涉及多少车辆和摩托车。

最初,我想使用groupby函数 + count函数 + conditional函数,但我无法得到我想要的。

有没有什么优雅的方法来解决这个问题?

您可以跨列使用notna和 sum 来获取非空计数:

import numpy as np
import pandas as pd

df = pd.DataFrame([[2010, 'Honda', np.nan, np.nan, 'Sedan', np.nan, '*'],
                   [2012, 'Yamaha', 'Kymco', np.nan, 'Truck', 'Sedan', '*'],
                   [2014, 'Harley', 'Kymco', 'Kymco', 'Ambulance', np.nan, '*']], columns=['year', 'motor1', 'motor2', 'motor3', 'vehicle1', 'vehicle2', 'reason'])

result = df.assign(count=df.loc[:, 'motor1':'vehicle2'].notna().sum(axis=1))

print(result)

输出:

   year  motor1 motor2 motor3   vehicle1 vehicle2 reason  count
0  2010   Honda    NaN    NaN      Sedan      NaN      *      2
1  2012  Yamaha  Kymco    NaN      Truck    Sedan      *      4
2  2014  Harley  Kymco  Kymco  Ambulance      NaN      *      4

要查看特定年份,您可以使用布尔索引:

print(result[result['year'] == 2010])

输出:

   year motor1 motor2 motor3 vehicle1 vehicle2 reason  count
0  2010  Honda    NaN    NaN    Sedan      NaN      *      2

我们可以通过使用notnasum over axis=1计算NaN的数量来做到这一点。 但首先我们使用DataFrame.filter过滤以获取以数字结尾的列:

df['count'] = df.filter(regex='\d$').notna().sum(axis=1)

   date  motor1 motor2 motor3   vehicle1 vehicle2 reason  count
0  2010   Honda    NaN    NaN      Sedan      NaN      *      2
1  2012  Yamaha  Kymco    NaN      Truck    Sedan      *      4
2  2013  Harley  Kymco  Kymco  Ambulance      NaN      *      4

解释正则表达式:

  • \\d是一个数字
  • $是字符串的结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM