【问题标题】:Elegant mapping of GroupBy into dataframeGroupBy 到数据框的优雅映射
【发布时间】:2020-03-16 07:17:33
【问题描述】:

为了最好地决定如何处理天气数据集中每个要素的缺失数据,我想获取每个要素和每个气象站的最长 NaN 块的长度,后者用“id”表示。尽管以下实现了这一点,但我知道代码的尴尬。什么是完成此任务的优雅方法(也许利用 GroupBy 对象的力量)?

有问题的尴尬代码:

max_nans = []
id_groups = weather_df.groupby('id')
for feature in weather_df.drop('id', axis=1):
    max_nans.append([max_repeated_nans(df_group[feature]) for name, df_group in id_groups])

pd.DataFrame(data=np.transpose(max_nans), index=id_groups.groups.keys(), columns=id_groups.obj.columns[1:])

功能:

def max_repeated_nans(a):
    mask = np.concatenate(([False],a.isnull(),[False]))
    if ~mask.any():
        return 0
    else:
        idx = np.nonzero(mask[1:] != mask[:-1])[0]
        return (idx[1::2] - idx[::2]).max()

df 示例:

weather_df = pd.DataFrame(
{ 
'id': [1,1,1,1, 
       2,2,2,2], 
'timestamp': ['2019-01-01 00:00:00', '2019-01-01 06:00:00', '2019-01-01 12:00:00', '2019-01-01 18:00:00',
              '2019-01-01 00:00:00', '2019-01-01 06:00:00', '2019-01-01 12:00:00', '2019-01-01 18:00:00'],
'temperature': [1.0, 1.1, 1.1, 1.4,
                20.0, np.nan, 24.0, 16.0], 
'wind_speed': [2,np.nan,np.nan,np.nan,
               5,5,3,2],
})

输出:

【问题讨论】:

  • 你能分享一些示例数据吗?理想情况下使用pd.DataFrame 构造函数,这样有人可以在寻找更简洁的解决方案之前执行您的代码并查看结果。例如。 weather_df = pd.DataFrame({'id': [1,2,3], 'other_col': ['a', 'b', 'c']})
  • max_repeated_nans 是一个函数吗?你似乎把它当作一个函数来调用。您应该包括函数定义。您应该包括所有必要的,以便可以执行代码。

标签: python pandas dataframe pandas-groupby missing-data


【解决方案1】:

如何使用agg 将您的功能应用于组:

result = weather_df.groupby('id').agg({
    'temperature': max_repeated_nans,
    'wind_speed': max_repeated_nans
})

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 2014-05-11
    • 1970-01-01
    • 2021-04-10
    • 2011-01-20
    • 2017-12-25
    • 2020-07-17
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多