Входной фрейм данных
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 ответа
Мы можем использовать 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]
Вы можете использовать explode()
и groupby()
а> :
(df.explode('r_id').ffill(axis=1).reset_index().groupby(['index','id'],sort=False).agg(list)
.reset_index(1))
id r_id
index
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]
Вы можете преобразовать идентификатор столбца в массив, добавить измерение, а затем составить его список и 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)
Я думаю, что ответ 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]
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.