forestdata.loc[forestdata.index[-1]] = df.iloc[-1] 执行后数据都变成 NAN
时间: 2023-12-07 21:04:04 浏览: 176
如果执行`forestdata.loc[forestdata.index[-1]] = df.iloc[-1]`后,`forestdata`的数据都变成了`NaN`,这可能是因为`df`和`forestdata`的列名不匹配导致的。可以使用`pandas.DataFrame.columns`属性查看两个数据框的列名是否一致。
如果列名不一致,可以使用`pandas.DataFrame.rename`方法修改`df`的列名,使其与`forestdata`的列名一致。具体实现代码如下:
```
df = pd.DataFrame(y_hat3)
df = df.rename(columns=dict(zip(df.columns, forestdata.columns)))
forestdata.loc[forestdata.index[-1]] = df.iloc[-1]
```
其中,`dict(zip(df.columns, forestdata.columns))`可以构造一个字典,将`df`的列名映射为`forestdata`的列名,`df.rename`将`df`的列名修改为`forestdata`的列名。这样就可以保证`df`和`forestdata`的列名一致,执行`forestdata.loc[forestdata.index[-1]] = df.iloc[-1]`后不会出现数据全部变成`NaN`的情况。
相关问题
简化下列语句:for i in range(len(data2_0_time3)): if (np.isnan(data2_0_time3.iat[i,0])==True): if 3<=i<=len(data2_0_time3)-4: data2_0_time3.loc[i,'speed_391_24': 'speed_391_22'] = data2_0_time3.iloc[i-3:i,0:3].fillna(0).values.mean(axis=0) elif i>len(data2_0_time3)-4: cols = ['speed_391_24', 'speed_391_23', 'speed_391_22'] rolling_df = data2_0_time3.loc[:i][cols].rolling(window=3, min_periods=1) data2_0_time3.loc[i, cols] = rolling_df.mean().iloc[-1].values else: data2_0_time3.loc[i, ['speed_391_24', 'speed_391_23', 'speed_391_22']] = np.nan_to_num(data2_0_time3.iloc[max(i-3,0):i+1, [0,1,2]].rolling(window=4, min_periods=1).sum().iloc[-1]/min(i+1, 4))
简化上述语句的方法:
1. 使用缩写变量名代替较长的列名,以增加代码可读性。
2. 使用单个布尔表达式来检查 np.isnan 函数的返回值。
3. 在重复的代码块中使用函数或类以减少冗余代码。
4. 在处理列表时排除索引错误,并使用 min 函数以避免除以零的错误。
简化后的代码如下所示:
def func(data):
cols = ['speed_391_24', 'speed_391_23', 'speed_391_22']
for i in range(len(data)):
if np.isnan(data.iloc[i,0]):
if 3<=i<=len(data)-4:
data.loc[i,cols] = data.iloc[i-3:i,0:3].fillna(0).values.mean(axis=0)
elif i>len(data)-4:
rolling_df = data.loc[:i][cols].rolling(window=3, min_periods=1)
data.loc[i,cols] = rolling_df.mean().iloc[-1].values
else:
data.loc[i,cols] = np.nan_to_num(data.iloc[max(i-3,0):i+1,[0,1,2]].rolling(window=4, min_periods=1).sum().iloc[-1]/min(i+1,4))
我的代码出现了警告:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame。请帮我找出问题出在哪以及怎么修改。代码如下:for key in fill_dic.keys(): if len(fill_dic[key]) == 1: # 若只匹配上了一个属性 for idx in list(df_feat.index): if df_feat.iloc[idx][key] == df_feat.iloc[idx][key]: # 若原属性是空,填充 df_feat.iloc[idx][key] = df_ner.iloc[idx][fill_dic.get(key)] else: # 若匹配上了多个属性 ner_filt = df_ner[fill_dic.get(key)] # 每行+多匹配上的属性列 for idx in list(df_feat.index): if df_feat.iloc[idx][key] == df_feat.iloc[idx][key]: # 若原属性是空,填充 for idy in range(len(fill_dic.get(key))): if ner_filt.iloc[idx, idy] == ner_filt.iloc[idx, idy]: # 若True则该标题属性不为NaN df_feat.iloc[idx][key] = ner_filt.iloc[idx, idy]
这个警告通常是因为在对DataFrame进行切片操作时,尝试对切片进行赋值操作,而切片返回的是原DataFrame的一个视图,而不是副本。为了避免这个警告,你可以使用`.loc`或`.iloc`来进行赋值操作。
在你的代码中,可以通过使用`.loc`来避免这个警告。具体修改如下:
```python
for key in fill_dic.keys():
if len(fill_dic[key]) == 1:
df_feat.loc[df_feat[key].isnull(), key] = df_ner[fill_dic[key]].values
else:
ner_filt = df_ner[fill_dic[key]]
for idx in list(df_feat.index):
if df_feat.loc[idx, key] == df_feat.loc[idx, key]:
for idy in range(len(fill_dic[key])):
if ner_filt.loc[idx, idy] == ner_filt.loc[idx, idy]:
df_feat.loc[idx, key] = ner_filt.loc[idx, idy]
```
使用`.loc`可以直接对选定的行和列进行赋值操作,避免了SettingWithCopyWarning警告。
阅读全文