如何使用Pandas中的groupby包含缺失项?

3
假设我有一个包含以下列的数据框:日期,时间,日,月,年,描述,价格,类型,制造商。
使用pandas和value_counts(),我可以获取每个列中唯一项的计数:
df.manufacturer.value_counts()

此外,使用groupby我可以得到我的数据中每天的平均价格:
df.groupby("day").price.mean()

问题在于总共有7天,但我的数据中可能只有5或6天,所以我需要补充缺失的天数,平均值为零或无。

一般来说,如果我有一个特定的列表,当我执行value_counts或groupby操作时,如何包含缺失的项?


你能添加示例数据吗? - jezrael
2个回答

4

我认为你可以将天数转换成分类,这样如果使用groupby + mean,就会对缺失的分类得到NaN

df = pd.DataFrame({
    'day': ['Monday','Tuesday','Tuesday','Tuesday','Thursday'],
    'price': list(range(5))
})
print (df)
        day  price
0    Monday      0
1   Tuesday      1
2   Tuesday      2
3   Tuesday      3
4  Thursday      4

cats = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
df['day'] = pd.Categorical(df['day'], categories=cats, ordered=True)
print(df.groupby("day", as_index=False).price.mean())
         day  price
0     Monday    0.0
1    Tuesday    2.0
2  Wednesday    NaN
3   Thursday    4.0
4     Friday    NaN
5   Saturday    NaN
6     Sunday    NaN

另一种解决方案是通过所有可能的类别进行重新索引

cats = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

print(df.groupby("day").price.mean().reindex(cats))
day
Monday       0.0
Tuesday      2.0
Wednesday    NaN
Thursday     4.0
Friday       NaN
Saturday     NaN
Sunday       NaN
Name: price, dtype: float64

print(df.groupby("day").price.mean().reindex(cats, fill_value=0))
day
Monday       0
Tuesday      2
Wednesday    0
Thursday     4
Friday       0
Saturday     0
Sunday       0
Name: price, dtype: int64

0
你应该使用分类数据。以下是一个最简示例。
import pandas as pd

df = pd.DataFrame([['Monday', 5], ['Monday', 6], ['Monday', 3],
                   ['Tuesday', 1], ['Tuesday', 8]],
                  columns=['day', 'value'])

# list days in order
day_list = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

# convert to categorical
df['day'] = df['day'].astype('category')

# set categories and ordered=True
df['day'] = df['day'].cat.set_categories(day_list, ordered=True)

# perform groupby and fillna with 0
res = df.groupby('day').mean().fillna(0)

结果:

              value
day                
Monday     4.666667
Tuesday    4.500000
Wednesday  0.000000
Thursday   0.000000
Friday     0.000000
Saturday   0.000000
Sunday     0.000000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接