【发布时间】:2019-11-23 04:23:59
【问题描述】:
我想为包含缺失值的 pandas 数据帧创建一个频率表。这是一个带有缺失值的示例数据框来说明我的问题:
import pandas as pd
import numpy as np
car_names = pd.DataFrame({'name' : ['Batmobile','Toyota Corolla','Bike',
'Bike','Batmobile'],
'hp': [1000,120,np.nan,np.nan,900]})
car_attr = pd.DataFrame({"name": ["Bike","Toyota Corolla"],
"color": ["blue","red"]})
cars = car_names.merge(car_attr,how='left',on='name')
name hp color
0 Batmobile 1000.0 NaN
1 Toyota Corolla 120.0 red
2 Bike NaN blue
3 Bike NaN blue
4 Batmobile 900.0 NaN
我想要的输出,显示一个值组合出现两次的频率表:
name hp color count
0 Bike NaN blue 2
1 Batmobile 1000.0 NaN 1
2 Toyota Corolla 120.0 red 1
3 Batmobile 900.0 NaN 1
我曾尝试使用 groupby().size() 但此方法排除了缺失值的行(即我的数据框中的每一行,除了第二行):
cars.groupby(['name','hp','color']).size()
name hp color
Toyota Corolla 120.0 red 1
我尝试过的另一种方法是将 pandas 数据框转换为列表列表(其中每一行都是一个列表)并使用 list.index() 函数来计算唯一行的出现次数,但我遇到了这个奇怪的错误:
my_rows = cars.values.tolist()
my_rows_dedup = cars.drop_duplicates().values.tolist()
for x in my_rows:
print(x)
print('Row index: ', my_rows.index(x),
' Unique Index: ', my_rows_dedup.index(x))
['Batmobile', 1000.0, nan]
Row index: 0 Unique Index: 0
['Toyota Corolla', 120.0, 'red']
Row index: 1 Unique Index: 1
['Bike', nan, 'blue']
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-100-f17351883e95> in <module>
4 for x in my_rows:
5 print(x)
----> 6 print('Row index: ', my_rows.index(x), ' Unique Index: ', my_rows_dedup.index(x))
ValueError: ['Bike', nan, 'blue'] is not in list
这个错误对我来说没有意义,因为 ['Bike', nan, 'blue'] 是 my_rows_dedup 中的一个值。
【问题讨论】:
-
您在问题中显示的数据框与您使用 pd.dataframe 构建的数据框不同
-
我的错误,我稍微更改了数据框以使其更短,并且忽略了更新此处的代码。现在已经修好了。
标签: python pandas dataframe data-science