numpy 使用np.where()+ .iloc[]会得到错误的结果,原因可能是iloc[]不再支持索引的元组格式

e1xvtsh3  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(106)

我写了这些代码,其中np.where().iloc[]用于将 Dataframe 中的NaN s更改为"missing"。然而,结果是错误的,原因可能是.iloc[]识别元组索引不聪明。
谁能给我一些指导来修复它,或者除了fillna()之外的其他方法?因为我想解决的真实的情况是通过在df1上应用条件来获取索引,并使用索引来更改df2中的值,所以fillna()在我的情况下可能没有帮助。

data = {'Name': ['John', 'Alice', 'Bob', 'Jane', 'Mark'],
    'Age': [25, 31, np.nan, 28, 35],
    'Salary': [50000, np.nan, 70000, np.nan, 90000]}
df = pd.DataFrame(data)
df

x

Name   Age   Salary
0   John  25.0  50000.0
1  Alice  31.0      NaN
2    Bob   NaN  70000.0
3   Jane  28.0      NaN
4   Mark  35.0  90000.0
# Use np.where and .iloc to replace missing values with a specified value
value_to_replace = "missing"
missing_mask = np.where(df.isna())  # Create a boolean mask for missing values
df.iloc[missing_mask]= value_to_replace  # Use np.where for replacement
df
Name      Age   Salary
0   John     25.0  50000.0
1  Alice  missing  missing
2    Bob  missing  missing
3   Jane  missing  missing
4   Mark     35.0  90000.0

的数据
预期结果应该是:

Name      Age   Salary  
0   John     25.0  50000.0  
1  Alice     31.0  missing  
2    Bob  missing  70000.0 
3   Jane     28.0  missing  
4   Mark     35.0  90000.0

8hhllhi2

8hhllhi21#

我不知道你为什么要这样做,因为你会把你的float值改为object类型,但这是可以做到的。我将使用DataFrame.where方法进行替换。这将替换条件计算为False的值 where。因为我们想要替换NaN的值,所以我们可以使用isna来找到NaN s,并应用逻辑NOT使其成为False,其中值为NaN。或者,@Timus指出,您可以使用notna,它与NOTed isna做同样的事情。

import pandas as pd
import numpy as np

data = {'Name': ['John', 'Alice', 'Bob', 'Jane', 'Mark'],
    'Age': [25, 31, np.nan, 28, 35],
    'Salary': [50000, np.nan, 70000, np.nan, 90000]}
df = pd.DataFrame(data)
df = df.where(~df.isna(), "missing")
print(df)
print(df.dtypes)

字符串
输出量:

Name      Age   Salary
0   John     25.0  50000.0
1  Alice     31.0  missing
2    Bob  missing  70000.0
3   Jane     28.0  missing
4   Mark     35.0  90000.0
Name      object
Age       object
Salary    object
dtype: object

klsxnrf1

klsxnrf12#

我试过了,效果很好:

import numpy as np

# Create the DataFrame
data = {'Name': ['John', 'Alice', 'Bob', 'Jane', 'Mark'],
        'Age': [25, 31, np.nan, 28, 35],
        'Salary': [50000, np.nan, 70000, np.nan, 90000]}
df = pd.DataFrame(data)

# Specify the value to replace NAs
value_to_replace = "missing"

# Find the indices where values are missing
missing_mask = np.where(df.isna())

# Unpack the tuple of indices and replace missing values
df.iloc[*missing_mask] = value_to_replace

# Print the resulting DataFrame
print(df)

字符串

相关问题