如何遍历某些列和所有行,如果值为 nan,则用其他列的值填充该值?

How can I loop though some columns and all rows, and if the value is nan, fill that value with values of other column?

我是 Python 的新手。我有一个包含以下列的数据框:州、城市、纬度和经度。有些城市没有 Lat 和 Long 的值,所以我想用 Lat 和 Long 的平均值来填充这些 nan。 我创建了两列,根据城市所在的州显示这两个字段的平均值。

grouped_State = df.groupby(["State"])
long_State = grouped_partido["Long"].mean()
lat_State = grouped_State["Lat"].mean()

data = df["State"],df["Lat"],df["Long"]
headers = ['State', "Lat_city","Long_city"]

df_x = pd.concat(data, axis=1, keys=headers)
df_x = pd.merge( left = df_x, right = long_partido , how = "left",
              left_on = "State", right_on = "State")
df_x = pd.merge( left = df_x, right = lat_partido , how = "left",
              left_on = "State", right_on = "State")

结果会是这样的:

Index  State  Lat_city  Long_city  Lat     Long
  0      A      -34       -56     -34.6    -56.1
  1      B      nan       nan     -33      -54.2
  2      A      nan       nan     -34.6    -56.1
  3      B      -35.3     -55.5   -33      -54.2

我想要得到的输出是这样的:

Index  State  Lat_city  Long_city  Lat     Long
  0      A      -34       -56     -34.6    -56.1
  1      B      -33      -54.2    -33      -54.2
  2      A      -34.6    -56.1    -34.6    -56.1
  3      B      -35.3     -55.5   -33      -54.2    

我一直在尝试使用不同类型的循环并尝试使用 lambda 函数,但没有达到预期的效果。

IIUC,你可以用 groupby 和 fillna() 做这样的事情。

df['Lat_city'] = df['Lat_city'].fillna(df.groupby(['State'])['Lat'].transform('mean'))
df['Long_city'] = df['Long_city'].fillna(df.groupby(['State'])['Long'].transform('mean'))

print(df)
        State   Lat_city    Long_city   Lat     Long
    0   A      -34.0      -56.0        -34.6    -56.1
    1   B      -33.0      -54.2        -33.0    -54.2
    2   A      -34.6      -56.1        -34.6    -56.1
    3   B      -35.3      -55.5        -33.0    -54.2

根据数据框文档,位于 (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html) .fillna 也排除系列。所以如果你要做 -

df['Lat_city'] = df['Lat_city'].fillna(df['Lat'])
df['Long_city'] = df['Long_city'].fillna(df['Long'])

您将获得预期的输出 -

 Index  State  Lat_city  Long_city  Lat     Long
  0      A      -34       -56     -34.6    -56.1
  1      B      -33      -54.2    -33      -54.2
  2      A      -34.6    -56.1    -34.6    -56.1
  3      B      -35.3     -55.5   -33      -54.2