如何遍历某些列和所有行,如果值为 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
我是 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