У меня есть фрейм данных, который выглядит так:
col1 col2 col3
X1 Nan Nan
foo bar baz
foo bar baz
X2 Nan Nan
foo bar baz
foo bar baz
X3 Nan Nan
foo bar baz
foo bar baz
Я отфильтровал так:
m = df.notna()
print(m)
col1 col2 col3
True False False
True True True
True True True
True False False
True True True
True True True
True False False
True True True
True True True
Мне нужно выбрать значение True в строке со значением False и создать новый столбец с этим значением. Например, мой результирующий df должен выглядеть так:
col1 col2 col3 new
foo bar baz X1
foo bar baz X1
foo bar baz X2
foo bar baz X2
foo bar baz X3
foo bar baz X3
Я не уверен, как это сделать с помощью панд, любые предложения помогут.
Одно из возможных решений — создать новый столбец на основе 'col1'
, когда col2
имеет значение null, затем ffill
создать новый столбец и удалить ненужные строки с помощью dropna
:
df["new"] = df["col1"][df["col2"].isna()]
df["new"] = df["new"].ffill()
df = df.dropna()
col1 col2 col3 new
1 foo bar baz X1
2 foo bar baz X1
4 foo bar baz X2
5 foo bar baz X2
7 foo bar baz X3
8 foo bar baz X3
Вариант подхода @e-motta с использованием присваивания , маски и логического индексирования:
m = df['col2'].notna()
out = df[m].assign(new=df['col1'].mask(m).ffill())
Если вы хотите рассматривать «col1» как заголовок, когда все остальные столбцы имеют значение NaN, другой вариант построения маски:
m = df.drop(columns='col1').notna().all(axis=1)
Выход:
col1 col2 col3 new
1 foo bar baz X1
2 foo bar baz X1
4 foo bar baz X2
5 foo bar baz X2
7 foo bar baz X3
8 foo bar baz X3