Как я могу l oop через некоторые столбцы и все строки, и если значение равно nan, заполнить это значение значениями другого столбца? - PullRequest
0 голосов
/ 19 июня 2020

Я новичок в Python. У меня есть фреймворк со следующими столбцами: State, City, Lat и Long. Некоторые города не имеют значения ни лат, ни долготы, поэтому я хотел использовать среднее значение лат и долготы, чтобы заполнить эти нан. Я создал два столбца, которые показывают среднее значение этих двух полей в соответствии со штатом, в котором расположен город.

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    

Я пробовал использовать разные типы циклов и экспериментировал с лямбда-функциями, но ничего не работало должным образом.

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Согласно документации фрейма данных, расположенной по адресу (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    

1 голос
/ 19 июня 2020

IIU C, вы можете сделать что-то подобное с помощью 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
...