2015-09-03 3 views
1

У меня есть два DataFrames в pandas:Объединение двух наборов данных, чтобы сформировать булево столбец (панды)

dfm_one

data group_a group_b 
0 3 a z 
1 1 a z 
2 2 b x 
3 0 b x 
4 0 b x 
5 1 b z 
6 0 c x 
7 0 c y 
8 3 c z 
9 3 c z 

dfm_two

data group_a group_b 
0 4 a x 
1 4 a y 
2 4 b x 
3 4 b x 
4 4 b y 
5 1 b y 
6 1 b z 
7 1 c x 
8 4 c y 
9 3 c z 
10 2 c z 

В выходе я хочу булево столбец, который указывает для dfm_one существует ли соответствующая запись данных (т.е. имеет ту же самую шкалу) в dfm_two для каждой группы group_a group_b.

Так что мой ожидается выход:

0 False 
1 False 
2 False 
3 False 
4 False 
5 True 
6 False 
7 False 
8 True 
9 True 

Я предполагаю, что код должен выглядеть примерно так:

dfm_one.groupby(['group_a','group_b']).apply(lambda x: ??) 

и что функция внутри apply должны использовать метод isin.

Другим решением может быть объединение двух наборов данных, но я думаю, что это не является тривиальным, так как в DataFrame нет уникального идентификатора.

+2

'dfm_one.merge (dfm_two)' даст вам общие ценности – EdChum

ответ

1

КИ это небольшой хак, если мы бросим ФР к str DTYPE, то мы можем назвать sum для конкатенации строк в строку, мы можем использовать полученную строку в качестве своего рода уникального идентификатора, а затем вызвать isin на другой ДФ, снова преобразование в str:

In [91]: 
dfm_one.astype(str).sum(axis=1).isin(dfm_two.astype(str).sum(axis=1)) 

Out[91]: 
0 False 
1 False 
2 False 
3 False 
4 False 
5  True 
6 False 
7 False 
8  True 
9  True 
dtype: bool 

Выход из преобразований:

In [92]: 
dfm_one.astype(str).sum(axis=1) 

Out[92]: 
0 3az 
1 1az 
2 2bx 
3 0bx 
4 0bx 
5 1bz 
6 0cx 
7 0cy 
8 3cz 
9 3cz 
dtype: object 

In [93]: 
dfm_two.astype(str).sum(axis=1) 

Out[93]: 
0  4ax 
1  4ay 
2  4bx 
3  4bx 
4  4by 
5  1by 
6  1bz 
7  1cx 
8  4cy 
9  3cz 
10 2cz 
dtype: object 
+0

Спасибо, это то, что я был аф тер! (Но я предполагаю, что операции с строкой заставят его работать довольно медленно в моем наборе данных с 30 mio + строками.) – Pilik

+0

, вероятно, но вызов 'apply' также будет очень медленным, поскольку это просто цикл' for' – EdChum

Смежные вопросы