首页 > 解决方案 > 如何在熊猫数据框中循环遍历具有不同条件的每一列-共享x轴图

问题描述

请原谅新的低信心熊猫用户的任何明显错误。

我有一个数据框,其中的列需要单独清理,因为它们具有不同数量的有效条目。我的目标是每天、每月和每年重新采样数据,并为每一列绘制每日、每月和每年的数据(作为时间序列)。我想要一个共享的 x 轴,每个列的多个 y 轴图,显示每日、每月和每年的系列。

如果我在整个数据帧上运行 drona() 和重采样函数,它会为每个重采样操作生成一个空数据帧。我的猜测是,它正在删除所有包含一列 NaN 的行。

所以,我想在一个循环中过滤掉每一列,并创建一次过滤一列的子数据框。最后,我可以为生成的每个较小的帧绘制一个共享的 x 轴图。

有没有更好的方法来实现我的目标?

这是我的数据框:

                     col1   col2  col3  col4  col5
date                                              
2015-01-03 00:00:00  None    32    42    None     3
2015-01-03 01:00:00    45    34    34     78     1.5
2015-01-03 02:00:00  None  53.5    NaN   None    1.5

这是我用于循环列和应用条件的代码的一部分:

for i in df.columns:
    print (i)
    df.[i]= pd.to_numeric(df.i,errors='coerce' )
    df=df[df['i'].notna()]
    df = df[df['i'] >= 0]
    df=df.filter (items = [i])
    #Resampling :
    df_hour = df['i'].resample('h').apply(lambda x: x.mean() if x.count()>1 else np.nan)
    df_hour_fix = df_hour[df_hour != np.nan]
    print (df_hour_fix)

运行它,这个错误突然出现: 'DataFrame' object has no attribute 'i'

标签: pandasloopsfor-loop

解决方案


看看这是否有帮助,是否能引导你正确的方式。我使用了不同的 df 来处理更多数据

                     col1  col2  col3  col4  col5
2000-01-01 00:00:00   NaN     0     0   NaN     0
2000-01-01 01:00:00   3.0     1     1   NaN     1
2000-01-01 02:00:00   4.0     2     2   NaN     2
2000-01-01 03:00:00   5.0     3     3   NaN     3
2000-01-01 04:00:00   NaN     4     4   NaN     4
2000-01-01 05:00:00   2.0     5     5   NaN     5
2000-01-01 06:00:00   9.0     6     6   NaN     6
2000-01-01 07:00:00   NaN     7     7   NaN     7
2000-01-01 08:00:00   NaN     8     8   NaN     8

避免循环。我会通过以下方式清理 df:

df = df.apply(pd.to_numeric)
df = df.mask(df<0)

最后,每 2 小时重新采样一次 df 并计算平均值。mean 方法的默认值是忽略 NaN。所以你可以在你的 df 中使用 NaN 安全地执行它。

df_hour = df.resample('2H').mean()

                     col1  col2  col3  col4  col5
2000-01-01 00:00:00   3.0   0.5   0.5   NaN   0.5
2000-01-01 02:00:00   4.5   2.5   2.5   NaN   2.5
2000-01-01 04:00:00   2.0   4.5   4.5   NaN   4.5
2000-01-01 06:00:00   9.0   6.5   6.5   NaN   6.5
2000-01-01 08:00:00   NaN   8.0   8.0   NaN   8.0

推荐阅读