Существует ли какая-либо похожая формула, такая как IFERROR, IF, MATCH, SEARCH, INDEX в python, pandas? - PullRequest
1 голос
/ 24 апреля 2020

У меня есть 3 набора данных Excel в 3 разных файлах, и я хотел бы использовать функцию поиска и сопоставления, затем проиндексировать результат, сохранить в новых файлах.

df = pd.DataFrame({'date': [16042020, 20042020, 16042020, 16042020, 17042020],
                    'no' : [230255,1755,210520, 65556,12355],
                    'des': ['ant','flower', 'happy','hate', 'okay'],
                    'des2': ['cheeeee','die', 'of','bore','sad']})

df1 = pd.DataFrame({ 'condition': ['good', 'bad', 'good',  'good',  'bad'],
                    'no': [230255,  1755,  7897, 6666, 1311],
                    'des': ['ant', 'flower', 'happy', 'hate','okay'],
                    'which no': ['1234', '5555', '3535','1359','8979']})

df2 = pd.DataFrame({ 'condition': ['bad', 'bad', 'good', 'good','good'],
                      'no': [46451,  448713, 210520, 65556, 8795],
                     'des': ['ant','flower', 'happy','hate', 'okay'],
                     'which no': [1234,  5555, 3535, 1359,8979]})

OUTPUT:
df     date      no     des     des2
0  16042020  230255     ant  cheeeee
1  20042020    1755  flower      die
2  16042020  210520   happy       of
3  16042020   65556    hate     bore
4  17042020   12355    okay      sad

df1 condition    no     des which no
0      good  230255     ant     1234
1       bad    1755  flower     5555
2      good    7897   happy     3535
3      good    6666    hate     1359
4       bad    1311    okay     8979

df2  condition   no     des  which no
0       bad   46451     ant      1234
1       bad  448713  flower      5555
2      good  210520   happy      3535
3      good   65556    hate      1359
4      good    8795    okay      8979

Мое намерение состоит в том, чтобы найти «нет» df в «нет» df1 с критериями «условие» = «хорошо», вывести «которое нет», если истина, если ложь, поиск в df2, если все еще false, выведите «NO MATCH»

, если я использую формулу листа Google, как показано ниже:

df'result' = iferror(index(df1'which no', match(1,search(isnumber(df'no',df1'no')))*(df1'condition' = "good"),0)),iferror(index(df2'which no', match(1,search(isnumber(df'no',df2'no')))*(df2'condition' = "good"),0))),"NO MATCH")

RESULT: 
       date      no     des     des2   **result**
0  16042020  230255     ant  cheeeee     1234
1  20042020    1755  flower      die     NO MATCH
2  16042020  210520   happy       of     3535
3  16042020   65556    hate     bore     1359
4  17042020   12355    okay      sad     NO MATCH

мой вывод должен быть таким, как показано ниже в новом столбце df excel файл и другой новый столбец, который показывает, из какого списка данные из (df1 / df2)

**result**     **from which list**
0   1234         df1
1  NO MATCH      NONE
2  3535          df2
3  1359          df2
4  NO MATCH     NONE

1 Ответ

1 голос
/ 24 апреля 2020

Идея состоит в том, чтобы сначала использовать concat, а затем фильтровать только good строки, а также при необходимости отфильтровывать дубликаты по no по DataFrame.drop_duplicates:

df3 = pd.concat([df1, df2]).query('condition == "good"').drop_duplicates('no')
print (df3)
  condition      no    des which no
0      good  230255    ant     1234
2      good    7897  happy     3535
3      good    6666   hate     1359
2      good  210520  happy     3535
3      good   65556   hate     1359
4      good    8795   okay     8979

А затем DataFrame.merge с помощью левого соединения с заменой отсутствующих значений на DataFrame.fillna:

df = df.merge(df3[['no','which no']], on='no', how='left').fillna({'which no':'NO MATCH'})
print (df)
       date      no     des     des2  which no
0  16042020  230255     ant  cheeeee      1234
1  20042020    1755  flower      die  NO MATCH
2  16042020  210520   happy       of      3535
3  16042020   65556    hate     bore      1359
4  17042020   12355    okay      sad  NO MATCH

РЕДАКТИРОВАТЬ: Если используется параметр keys с DataFrame.reset_index создается новый столбец:

df3 = (pd.concat([df1, df2], keys=('df1','df2'))
        .reset_index()
        .rename(columns={'level_0':'from which list'})
        .query('condition == "good"'))
print (df3)
  from which list  level_1 condition      no    des which no
0             df1        0      good  230255    ant     1234
2             df1        2      good    7897  happy     3535
3             df1        3      good    6666   hate     1359
7             df2        2      good  210520  happy     3535
8             df2        3      good   65556   hate     1359
9             df2        4      good    8795   okay     8979

..., а затем фильтр df3 для этого столбца в списке:

df = (df.merge(df3[['no','which no', 'from which list']], on='no', how='left')
       .fillna({'which no':'NO MATCH'}))
print (df)
       date      no     des     des2  which no from which list
0  16042020  230255     ant  cheeeee      1234             df1
1  20042020    1755  flower      die  NO MATCH             NaN
2  16042020  210520   happy       of      3535             df2
3  16042020   65556    hate     bore      1359             df2
4  17042020   12355    okay      sad  NO MATCH             NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...