Я создал df2
, как вы указали, желая нового df
.
df2 = df.copy()
df_res = df2[df2['building:use'] == 'residential']
df2.loc[df_res.index, 'building'] = df_res['building:use']
Для справки: ваш пример набора данных
import pandas as pd
df = pd.DataFrame(
{
"building": ["industrial", "office", "police", "house", "church"],
"building:use": [None, None, None, None, "residential"],
}
)
Я благодарен @dydev за пример формата набора данных. Спасибо. У меня были проблемы с форматированием таблицы. Будет ли «df_res… != None» выбирать все значения, кроме «Нет»?
df2[~df2['building:use'].isna()]
выберет все значения, которые не равны нулю (или None
в данном случае).
Зачем создавать df_res
(который мог бы занять много места, если бы настоящий df
был очень большим), если можно просто использовать фильтр напрямую? df2.loc[df2['building:use'] == 'residential', 'building'] = df2['building:use']
Это просто первое решение, которое пришло в голову. ОП не уточнил необходимость оптимизации из-за большого набора данных.
Вы можете использовать Series.mask() (или .where()) для замены значений в столбце на основе условия:
building1 = df['building'].mask(
df['building:use'] == 'residential',
df['building:use'])
0 industrial
1 office
2 police
3 house
4 residential
Name: building, dtype: object
Затем, чтобы создать новый фрейм данных с измененным столбцом, вы можете использовать df.assign():
df1 = df.assign(building=building1)
building building:use
0 industrial None
1 office None
2 police None
3 house None
4 residential residential
Спасибо @wjandrea. Тот же вопрос, что и ниже. Если я хочу выбрать все значения, кроме None
, изменится ли условие building1 = ...df['building:use'] != None,...
?
@arkriger На самом деле это гораздо более сложный вопрос :) Это на самом деле None
или строки, 'None'
? Мой ответ не содержит никаких предположений по этому поводу. Если это на самом деле None
, читали ли вы страницу руководства пользователя о недостающих данных ? Возможно ли, что столбец содержит NaN
? Это слишком много, чтобы обсуждать это в комментариях, поэтому вы можете задать новый вопрос, если хотите. Обязательно сделайте воспроизводимый пример панд.
Не могли бы вы предоставить ожидаемый результат? Возможно, вы имели в виду, что если в столбце
building:use
естьresidential
, то ту же строку в столбцеbuilding
(church
в примере выше) следует изменить наresidential