Входной фрейм данных

data = {

'id' :[70,70,1148,557,557,104,581,69],
'r_id' : [[70,34, 44, 23, 11, 71], [70, 53, 33, 73, 41], 
          np.nan, np.nan, np.nan, np.nan,np.nan,[69, 68, 7],]
}

df = pd.DataFrame.from_dict(data)
print (df)
     id                      r_id
0    70  [70, 34, 44, 23, 11, 71]
1    70      [70, 53, 33, 73, 41]
2  1148                       NaN
3   557                       NaN
4   557                       NaN
5   104                       NaN
6   581                       NaN
7    69               [69, 68, 7]

Выходной фрейм данных,

data = {

'id' :[70,70,1148,557,557,104,581,69],
'r_id' : [[70,34, 44, 23, 11, 71], [70, 53, 33, 73, 41], 
          [1148], [557], [557], [104],[581],[69, 68, 7]]
}

df = pd.DataFrame.from_dict(data)
print (df)
     id                      r_id
0    70  [70, 34, 44, 23, 11, 71]
1    70      [70, 53, 33, 73, 41]
2  1148                    [1148]
3   557                     [557]
4   557                     [557]
5   104                     [104]
6   581                     [581]
7    69               [69, 68, 7]

Я хочу, чтобы целевой столбец r_id со столбцом списка, идентификатор исходного столбца не является списком, ссылается на ссылки ниже в stackoverflow, python-pandas- заменить -нан - в - одной колонки Пробовал также следующее, data_merge_rel.RELATED_DEVICE.fillna (data_merge_rel.DF0_Desc_Label_i.to_list (), inplace = True)

4
vinsent paramanantham 18 Дек 2019 в 20:35

4 ответа

Мы можем использовать list_comprehension + Series.fillna.

Сначала мы создаем список со всеми значениями id, преобразованными в тип list. Затем мы заменим NaN здесь нашими значениями списка:

df['temp'] = [[x] for x in df['id']]
df['r_id'] = df['r_id'].fillna(df['temp'])
df = df.drop(columns='temp')

Или в одну строку, используя apply (спасибо r.ook )

df['r_id'] = df['r_id'].fillna(df['id'].apply(lambda x: [x]))
     id                      r_id
0    70  [70, 34, 44, 23, 11, 71]
1    70      [70, 53, 33, 73, 41]
2  1148                    [1148]
3   557                     [557]
4   557                     [557]
5   104                     [104]
6   581                     [581]
7    69               [69, 68, 7]
2
Erfan 18 Дек 2019 в 18:12

Вы можете преобразовать идентификатор столбца в массив, добавить измерение, а затем составить его список и fillna с помощью Series, например:

df['r_id'] = df['r_id'].fillna(pd.Series(df.id.to_numpy()[:,None].tolist(), index=df.index))
print (df)
     id                      r_id
0    70  [70, 34, 44, 23, 11, 71]
1    70      [70, 53, 33, 73, 41]
2  1148                    [1148]
3   557                     [557]
4   557                     [557]
5   104                     [104]
6   581                     [581]
7    69               [69, 68, 7]

Или если у вас не много nan, возможно, стоит выбрать только эти строки, прежде чем делать что-либо:

mask_na = df.r_id.isna()
df.loc[mask_na, 'r_id'] = pd.Series(df.loc[mask_na,'id'].to_numpy()[:,None].tolist(), 
                                    index=df[mask_na].index)
1
Ben.T 18 Дек 2019 в 17:52

Я думаю, что ответ anky_91 будет быстрее, но вы также можете попробовать это:

df['r_id'] = np.where(df['r_id'].isnull(),
                      df['id'].apply(lambda x: [x]),
                      df['r_id'])

Выход:

     id                      r_id
0    70  [70, 34, 44, 23, 11, 71]
1    70      [70, 53, 33, 73, 41]
2  1148                    [1148]
3   557                     [557]
4   557                     [557]
5   104                     [104]
6   581                     [581]
7    69               [69, 68, 7]
1
Dan 18 Дек 2019 в 17:54