Перевод формулы Excel в Python 3 - PullRequest
0 голосов
/ 21 апреля 2020

Я застрял, переводя следующую формулу Excel в Python 3 код:

=IF(B1="";A1&D1;A1&VLOOKUP(B1;table_2!table_2_col_A:table_2_col_B;2;FALSE))

Я пробовал следующее, но он не дает те же результаты, что в исходном столбце файла Excel :

excel_df['new_col)'] = ''

for i, j, k in zip(excel_df['B'], 
                   excel_df['A'], 
                   excel_df['D']):

    for v, x in zip(table_2['A'], 
                    table_2['B']):

        if not pd.isnull(i):

            if i in v:

                excel_df.at[i, 'new_col'] = j + x

        elif pd.isnull(i):

            excel_df.at[i, 'new_col'] = j + k

Извините, потому что я не могу сгенерировать пример данных для вас, и я не могу поделиться исходными данными здесь. Я был бы очень признателен, если бы вы предоставили какие-либо указания или исправления, чтобы лучше адаптировать эту формулу Excel к python.

Заранее большое спасибо

Ответы [ 2 ]

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

Предположим, что ваша таблица выглядит примерно так:

>>> df 

    A    B   C   D
0  A0   B0  C0  D0
1  A1   B1  C1  D1
2  A2   B2  C2  D2
3  A3  NaN  C3  D3
4  A4   B4  C4  D4
5  A5   B5  C5  D5
6  A6  NaN  C6  D6
7  A7  NaN  C7  D7
8  A8  NaN  C8  D8
9  A9  NaN  C9  D9

>>> table_2

      A    B
0   B20  x20
1   B19  x19
2   B18  x18
3   B17  x17
4   B16  x16
5   B15  x15
6   B14  x14
7   B13  x13
8   B12  x12
9   B11  x11
10  B10  x10
11   B9   x9
12   B8   x8
13   B7   x7
14   B6   x6
15   B5   x5
16   B4   x4
17   B3   x3
18   B2   x2
19   B1   x1

Вот один из способов сделать это:

# Prepare table_2 into a "look up" table of sort
>>> table_2 = table_2.set_index('A')

# Formula translation
>>> df = df.assign(result=df.apply(lambda x: (x['A'] + x['D']) if pd.isna(x['B']) else table_2['B'].get(x['B']), axis=1))

Результат:

>>> df
    A    B   C   D result
0  A0   B0  C0  D0   None
1  A1   B1  C1  D1     x1
2  A2   B2  C2  D2     x2
3  A3  NaN  C3  D3   A3D3
4  A4   B4  C4  D4     x4
5  A5   B5  C5  D5     x5
6  A6  NaN  C6  D6   A6D6
7  A7  NaN  C7  D7   A7D7
8  A8  NaN  C8  D8   A8D8
9  A9  NaN  C9  D9   A9D9

Использование apply не совсем идеальное решение, но оно дает вам некоторую гибкость в обработке условий.

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

Это, вероятно, то, что вы ищете:

tbl2 = table_2[['col_A','col_B']]

## df has columns A,B,D
df = df.merge(tbl2,left_on=['B'],right_on=['col_A'],how='left')
# df['col_B'] = df['col_B'].fillna(0)
df['result'] = np.where(df['B']=='',df['A']*df['D'],df['A']*df['col_B'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...