Как работает слияние в пандах - PullRequest
0 голосов
/ 25 апреля 2018

Я отправил вопросы ранее и получил ответ.

Не могли бы вы объяснить, как работает объединение final_df = pd.merge(df, temp_df.reset_index(), how="left").fillna(0)? Я получаю правильные результаты, но я не понимаю, как происходит соединение. Между df и temp_df нет общих столбцов.

Рабочий код, как показано ниже:

    d = {'emp': ['a',   'a',    'a',    'a',    'b',    'b',    'b',    'c',    'c',    'c',    'c' ], 
     'date': ['1',  '1',    '1',    '1',    '2',    '2',    '2',    '3',    '3',    '3',    '3' ], 
     'usd':[1,  2,  3,  4,  5,  6,  7,  8,  9,  10,     11 ], 
     'expense type':['Car Mileage',     'Car Rental',   'Car Rental - Gas',     'food',     'Car Rental',   'Car Rental - Gas',     'food',     'Car Mileage',  'Car Rental',   'food',     'wine' ],
     'zflag':['1',  '1', '1',   ' ',' ',' ',' ','2','2',' ',' ' ]
     }

    df = pd.DataFrame(data=d)



        df
    Out[253]: 
       date emp      expense type  usd zflag
    0     1   a       Car Mileage    1     1
    1     1   a        Car Rental    2     1
    2     1   a  Car Rental - Gas    3     1
    3     1   a              food    4      
    4     2   b        Car Rental    5      
    5     2   b  Car Rental - Gas    6      
    6     2   b              food    7      
    7     3   c       Car Mileage    8     2
    8     3   c        Car Rental    9     2
    9     3   c              food   10      
    10    3   c              wine   11   


temp_df = df.groupby(["emp", "date"], axis=0)["expense type"].apply(lambda x: 1 if "Car Mileage" in x.values and any([k in x.values for k in ["Car Rental", "Car Rental - Gas"]]) else 0).rename("zzflag")
temp_df = temp_df.loc[temp_df!=0,:].cumsum()
final_df = pd.merge(df, temp_df.reset_index(), how="left").fillna(0)

Обновление 1:

temp_df не имеет индекса, и это серия. Поэтому я не уверен, как может происходить объединение в индексе, как это предлагается в комментарии.

temp_df
Out[335]: 
emp  date
a    1       1
c    3       2
Name: zzflag, dtype: int64

1 Ответ

0 голосов
/ 25 апреля 2018

pd.merge без параметров on или index объединяется с общими именами столбцов:

В соответствии с API Документов в pandas для pd.merge посмотрите на параметр «on»:

on: ярлык или список Имена полей для присоединения. Должен быть найден в обоих DataFrames. Если на это Нет и не сливается по индексам, затем сливается на пересечении столбцы по умолчанию .

d = {'emp': ['a',   'a',    'a',    'a',    'b',    'b',    'b',    'c',    'c',    'c',    'c' ], 
     'date': ['1',  '1',    '1',    '1',    '2',    '2',    '2',    '3',    '3',    '3',    '3' ], 
     'usd':[1,  2,  3,  4,  5,  6,  7,  8,  9,  10,     11 ], 
     'expense type':['Car Mileage',     'Car Rental',   'Car Rental - Gas',     'food',     'Car Rental',   'Car Rental - Gas',     'food',     'Car Mileage',  'Car Rental',   'food',     'wine' ],
     'zflag':['1',  '1', '1',   ' ',' ',' ',' ','2','2',' ',' ' ]
     }

df = pd.DataFrame(data=d)
temp_df = df.groupby(["emp", "date"], axis=0)["expense type"].apply(lambda x: 1 if "Car Mileage" in x.values and any([k in x.values for k in ["Car Rental", "Car Rental - Gas"]]) else 0).rename("zzflag")
temp_df = temp_df.loc[temp_df!=0,:].cumsum()
a = temp_df.reset_index()

all(pd.merge(df, a) == pd.merge(df, a, on=['emp','date']))

Выход:

True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...