#python #pandas
#python #pandas
Вопрос:
У меня есть следующая таблица, загруженная в виде фрейма данных в Python с использованием pandas
-------- ------- ------
| Number | Col1 | Col2 |
-------- ------- ------
| ABC | TRUE | SFG |
| BCD | TRUE | |
| CDE | FALSE | SFG |
| DEF | FALSE | |
| FEG | TRUE | JJI |
-------- ------- ------
Число, Col2 — строка; Col1 — логическое значение
Я хочу выбрать строки из этого df
, используя следующую логику
IF Col1 = TRUE and Col2 is not null Select Number "," Col2
ELSE IF Col1 = TRUE and Col2 is null Select Number
ELSE IF Col2 is not null and Col1 = FALSE Select Col2
В приведенном выше случае выводом должен быть список со следующими значениями
["ABC", "SFG", "BCD", "FEG", "JJI"] //Removing the repetition too ("SFG")
Как мне реализовать эту логику в Python с использованием Pandas?
Комментарии:
1. хммм, я
['ABC,SFG', 'BCD', 'SFG', nan, 'FEG,JJI']
следую вашей логике2. вероятно, вы захотите использовать вложенные
numpy.where
инструкции.
Ответ №1:
используйте where
stack
tolist
pd.concat([df.Number.where(df.Col1, np.nan), df.Col2], axis=1).stack().tolist()
['ABC', 'SFG', 'BCD', 'SFG', 'FEG', 'JJI']
чтобы получить уникальный список
pd.concat([df.Number[df.Col1], df.Col2.dropna()]).unique().tolist()
['ABC', 'BCD', 'FEG', 'SFG', 'JJI']
Ответ №2:
Вот реализация вашего запроса в несколько этапов:
import pandas as pd
df = pd.DataFrame(data={'Number': ['ABC', 'BCD', 'CDE', 'DEF', 'FEG'],
'Col1': [True, True, False, False, True],
'Col2': ['SFG', None, 'SFG', None, 'JJI']})
cond1 = df.Col1 amp; ~df.Col2.isnull()
cond2 = df.Col1 amp; df.Col2.isnull()
cond3 = ~df.Col1 amp; ~df.Col2.isnull()
selects = [df[cond1].Number ',' df[cond1].Col2,
df[cond2].Number,
df[cond3].Col2]
result = pd.concat(selects).sort_index()
result
является (таким же, как предсказывал @MaxU)
0 ABC,SFG
1 BCD
2 SFG
4 FEG,JJI
dtype: object