Поиск нескольких значений в нескольких строках для каждого уникального значения в Python - PullRequest
0 голосов
/ 29 июня 2018

У меня есть 3 поля 1 :) Счет-фактура № 2 :) Номер счета-фактуры и сумма счета-фактуры 3 :). Каждый уникальный номер счета может иметь несколько дополнительных номеров счетов. Требование заключается в том, что для каждого уникального номера счета-фактуры в нескольких строках, если под номер счета-фактуры начинается с 1200 и 2100, следует ввести фиктивный столбец, который будет говорить «И 1200, и 2100 существует», иначе, если строки имеют под номер счета-фактуры. начиная с 1200, столбец-заглушка должен иметь «только 1200», иначе он должен сказать «имеет только 2100». пример приведен ниже

S.no Invoice #    Invoice Sub Number    Amount    Dummy
----------------------------------------------
 1.   1234              1230             $100  Both 2100 and 1200 exists
 2.   1234              2100             $100  Both 2100 and 1200 exists
 3.   1234              1200             $100  Both 2100 and 1200 exists
 4.   1245              5430             $50   Only 1200 exists 1245      
 5.   1245              1200             $80   Only 1200 exists

Я попробовал следующую команду в Python, но она не работает, нужна помощь на том же Используемая команда

df1= df
df1['Invoice #'] = df1['Invoice #'].astype(object)
df['Invoice sub Number'] = df['Invoice sub Number'].astype(str)
df1= df1.groupby(df['Invoice sub Number','Invoice #'].size().groupby(level=0).size())

df1['dummy']= np.where(df1['Invoice sub Number'].str.startswith ('1200'),'Contains 1200 only',
               np.where(df1['Invoice sub Number'].str.startswith ('2100'),'Contains 2100 only',
                        np.where((df1['Invoice sub Number'].str.startswith ('1200'))&(df1['Invoice sub Number'].str.startswith ('2100')),
                                 'Contains both 1200 and 2100','Contains neither 1200 nor 2100')))

Ошибка, которую я получаю: - KeyError: ('Invoice sub Number', 'Invoice #')

1 Ответ

0 голосов
/ 29 июня 2018

Я предлагаю использовать GroupBy.any с transform для проверки не менее одного True с на группы, а затем для столбца по условиям numpy.select:

Использование:

print (df)
    Invoice #  Invoice sub Number  Amount
0         123                1234     100
1         123                2345     200
2         123                3456     300
3         123                1200     400
4         123                2100     500
5        1234                1245     600
6        1234                2344     700
7        1234                1200     800
8        2345                 345     900
9        2345                2100    1000
10       2345                2458    1100
11       6789                2345    1200
12       6789                3421    1300
13       6789                1234    1400

m1 = df['Invoice sub Number'].astype(str).str.startswith('1200')    
m2 = df['Invoice sub Number'].astype(str).str.startswith('2100')

m11 = m1.groupby(df['Invoice #']).transform('any')
m22 = m2.groupby(df['Invoice #']).transform('any')

masks =[ m11 & m22 , m11, m22]
vals = ['Contains both 1200 and 2100', 'Contains 1200 only','Contains 2100 only']
default = 'Contains neither 1200 nor 2100'         

df['dummy'] = np.select(masks, vals, default=default)

print (df)
    Invoice #  Invoice sub Number  Amount                           dummy
0         123                1234     100     Contains both 1200 and 2100
1         123                2345     200     Contains both 1200 and 2100
2         123                3456     300     Contains both 1200 and 2100
3         123                1200     400     Contains both 1200 and 2100
4         123                2100     500     Contains both 1200 and 2100
5        1234                1245     600              Contains 1200 only
6        1234                2344     700              Contains 1200 only
7        1234                1200     800              Contains 1200 only
8        2345                 345     900              Contains 2100 only
9        2345                2100    1000              Contains 2100 only
10       2345                2458    1100              Contains 2100 only
11       6789                2345    1200  Contains neither 1200 nor 2100
12       6789                3421    1300  Contains neither 1200 nor 2100
13       6789                1234    1400  Contains neither 1200 nor 2100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...