[英]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
我们可以通过使用notna
和sum
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.