我有一个与摩托车相关的熊猫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
函数,但是我无法获得想要的东西。
有没有解决问题的优雅方法?
答案 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
上计算notna
和sum
来计算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
是一个数字$
是字符串的结尾。