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

时间:2019-06-25 22:07:15

标签: python pandas dataframe

我有一个与摩托车相关的熊猫DataFrame。 数据集有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函数,但是我无法获得想要的东西。

有没有解决问题的优雅方法?

2 个答案:

答案 0 :(得分:1)

您可以使用notna对各列求和以得出非空计数:

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

答案 1 :(得分:0)

我们可以通过在NaN上计算notnasum来计算axis=1的数量。但是首先我们用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是一个数字
  • $是字符串的结尾。