Панды выделяются как вложенные графы - PullRequest
0 голосов
/ 09 октября 2018

я бью блок здесь.Я должен перевести эту формулу Excel

=IF(COUNTIFS(advisor!$C:$C,$A3)=0,"0 disclosed",
IF(COUNTIFS(advisor!$C:$C,$A3,advisor!$E:$E,2)>0,"Dependent",
IF(IF(COUNTIFS(advisor!$C:$C,$A3,advisor!$B:$B,"auditor")>0,1,0)+IF(COUNTIFS(advisor!$C:$C,$A3,advisor!$B:$B,"compensation")>0,1,0)=2,"Independent","1 disclosed")))

, пока это мое решение для python-pandas:

df['auditor_compensation'] = np.where(df['id'].isin(df_advisor['company_id']).count() == 0,
                                          '0 disclosed',
                                          np.where(df_advisor['dependent'] == 2, 'dependent',
                                          np.where((np.where(df_advisor['type']=='auditor', 1, 0)+np.where(df_advisor['type']=='compensation', 1, 0)) == 2, 'independent', '1 disclosed')))

, которое я продолжаю получать ValueError: Length of values does not match length of index

df пример данных: данные компании

id      ticker       iq_id     company              auditor_compensation
48299   ENXTAM:AALB  IQ881736   Aalberts Industries       ?
48752   ENXTAM:ABN   IQ1090191  ABN AMRO Group            ?
48865   ENXTAM:ACCEL IQ4492981  Accell Group              ?
49226   ENXTAM:AGN   IQ247906   AEGON                     ?
49503   ENXTAM:AD    IQ373545   Koninklijke               ?

ниже df_advisor пример данных

id    type          company_id  advisor_company_id  dependent
1     auditor       4829        6091                    1
17    auditor       4875        16512                   1
6359  auditor       4886        7360                    1
37    auditor       4922        8187                    1
4415  compensation  4922        9025                    1
53    auditor       4950        8187                    1

Любая помощь будет очень признательна.

1 Ответ

0 голосов
/ 09 октября 2018

Ваша функция numpy.where не создает массив или серию такой же длины, как исходный кадр данных.Это потому, что он пытается объединить несовместимые условия, например, df['id'] и df_advisor['dependent'] будут иметь разную длину.

Хотя соблазнительно перевести формулу Excel в Pandas / NumPy, используя GroupBy, pd.DataFrame.merge и np.select, вероятно, будут более эффективными и удобочитаемыми.

Шаг 1: Кадр данных группового отображения

df_advisor_grouped = df_advisor.groupby('company_id')\
                               .agg({'type': '|'.join, 'dependent': 'sum'})\
                               .reset_index()

print(df_advisor_grouped)

   company_id                  type  dependent
0        4829               auditor          1
1        4875               auditor          1
2        4886               auditor          1
3        4922  auditor|compensation          2
4        4950               auditor          1

Шаг 2: объединить с основным фреймом данных

# merge dataframes based on key column
res = df.merge(df_advisor_grouped, left_on='id', right_on='company_id', how='left')

Шаг 3: применить условную логику

# define 3 conditions
conds = [res['company_id'].isnull(), res['dependent'].eq(2),
         res['type'].str.contains('auditor') & res['type'].str.contains('compensation')]

# define 3 choices
choices = ['0 disclosed', 'dependent', 'independent'] 

# apply np.select logic, including default argument if 3 conditions are not met
res['auditor_compensation'] = np.select(conds, choices, '1 disclosed')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...