Pandas将列值替换为该列的滚动和

2024-09-23 20:15:40 发布

您现在位置:Python中文网/ 问答频道 /正文

虽然这个问题看起来像是许多其他问题的重复,但我还没有找到一个解决方案,它不需要在我的dataframe中创建一个新列,或者删除一个列并在末尾附加一个新列

假设我有以下几点:

dataframe = pd.read_csv(csv_name, encoding='utf-8')
new_dataframe = dataframe[['Date Time', 'T (degC)', 'rh (%)', 'Tdew (degC)', 'rain (mm)', 'p (mbar)', 'wv (m/s)']]

这给了我一个包含7列和大量行的数据框架,为了简单起见,我将使用.head()函数来获得更清晰的显示

我想做的是沿着rain (mm)列的滚动和,并用计算出的滚动和替换所述列中的值。我拥有的数据是每10分钟一次,我需要过去3小时的总和,因此我将以下内容应用于我的变量new_dataframe

print(new_dataframe.loc[:, ['rain (mm)']].rolling(18).sum().round(2).head(20))这给了我以下输出:

    rain (mm)
0         NaN
1         NaN
2         NaN
3         NaN
4         NaN
5         NaN
6         NaN
7         NaN
8         NaN
9         NaN
10        NaN
11        NaN
12        NaN
13        NaN
14        NaN
15        NaN
16        NaN
17        0.0
18        0.0
19        0.0

NaN不是问题,因为我的数据帧中有其他变量,这将导致我删除许多条目,包括那些条目

打印全局new_dataframe变量将提供以下输出:

              Date Time  T (degC)  rh (%)  Tdew (degC)  rain (mm)  p (mbar)  wv (m/s)
0   01.07.2002 00:10:04     15.44   66.01         9.13        0.0    995.50   -9999.0
1   01.07.2002 00:20:04     15.42   66.91         9.31        0.0    995.44   -9999.0
2   01.07.2002 00:30:04     15.29   67.51         9.32        0.0    995.34   -9999.0
3   01.07.2002 00:40:04     15.15   69.59         9.64        0.0    995.27   -9999.0
4   01.07.2002 00:50:04     14.80   75.20        10.46        0.0    995.19   -9999.0
5   01.07.2002 01:00:04     14.38   77.90        10.58        0.0    995.11   -9999.0
6   01.07.2002 01:10:04     14.12   80.10        10.75        0.0    995.06   -9999.0
7   01.07.2002 01:20:04     13.91   81.90        10.88        0.0    995.05   -9999.0
8   01.07.2002 01:30:04     13.75   81.60        10.66        0.0    995.06   -9999.0
9   01.07.2002 01:40:04     13.74   81.90        10.71        0.0    995.05   -9999.0
10  01.07.2002 01:50:04     13.69   82.10        10.70        0.0    995.03   -9999.0
11  01.07.2002 02:00:04     13.50   82.70        10.62        0.0    994.99   -9999.0
12  01.07.2002 02:10:04     13.32   85.20        10.89        0.0    994.93   -9999.0
13  01.07.2002 02:20:04     13.17   85.40        10.78        0.0    994.86   -9999.0
14  01.07.2002 02:30:04     13.08   84.10        10.46        0.0    994.80   -9999.0
15  01.07.2002 02:40:04     12.96   85.70        10.63        0.0    994.80   -9999.0
16  01.07.2002 02:50:04     12.92   87.90        10.97        0.0    994.81   -9999.0
17  01.07.2002 03:00:04     12.89   87.60        10.89        0.0    994.81   -9999.0
18  01.07.2002 03:10:04     12.94   87.60        10.94        0.0    994.76   -9999.0
19  01.07.2002 03:20:04     12.80   85.70        10.47        0.0    994.73   -9999.0

(对于那些想知道的人,是的,-9999.0是我用来删除不必要行的东西)

我想做的是简单地将new_dataframe中的rain (mm)列替换为计算滚动和时的new_dataframe列。我坚持使用单词替换,因为我需要列保持在相同的索引中

提前谢谢

如果这是复制品,请告诉我。我将通过确认提议的副本是否真的解决了我的问题来跟进


Tags: csv数据dataframenewdatetimenanhead
1条回答
网友
1楼 · 发布于 2024-09-23 20:15:40

花了一些时间摆弄,我找到了以下解决方案:

dataframe = pd.read_csv(csv_name, encoding='utf-8')
new_dataframe = dataframe[['Date Time', 'T (degC)', 'rh (%)', 'Tdew (degC)', 'rain (mm)', 'p (mbar)', 'wv (m/s)']].copy()
temp_dataframe = dataframe.loc[:, ['rain (mm)']].rolling(18).sum().round(2)
new_dataframe['rain (mm)'] = temp_dataframe['rain (mm)']
print(new_dataframe.head(20))

在创建new_dataframe变量时添加.copy()可以解决SettingWithCopyWarning问题并给出预期结果

该警告是由于我的初始代码实际上直接修改了从csv文件读取的数据帧,这通常会导致警告或错误

相关问题 更多 >