2017-01-03 1 views
1

У меня есть два набора «A» и «B», как создать набор C = Минус B в pandas.Here A и B являются dataframes. A - это кадр данных, содержащий имя и фамилию в качестве мультииндекса. b имеет целые числа в качестве индекса. Имя и фамилия являются столбцами в B.У меня есть два набора «A» и «B», как создать набор C = A минус B в pandas

Я попытался преобразовать мультииндекс A в столбец A по A ['index'] = A.index, а затем попытался объединить B и A. Но он не работает ,

А:

csv for A.csv

Б:

csv for B.csv

Столбцы B (f_Name и l_name) являются мультииндекс А.

Я хочу все строки в для которых f_name и l_name не существуют в B как output.I ahve пробовал следующий код:

А [ 'индекс'] = A.index

my_df = pd.merge (А, В, left_on = [ 'F_name', 'L_name'], right_index = Правда, как = 'левый']

ans_df = а [~ A.index.isin (my_df.index)]

но Len (and_df) является такой же, как LEN (а), которая не является правильным. Длина ans_df должна быть меньше, чем А, как несколько f_name и l_name существуют в В.

+1

Пожалуйста, покажите нам код от того, что вы пытались до сих пор, и указать, какие именно "не работает". – gus27

+0

привет @ gus27, не могли бы вы помочь ... Я добавил код в вопрос – Mahesh

+0

, почему это должно быть, как потянуть. Вы отправили свой код, но хотите ли вы его форматировать? нет. – e4c5

ответ

1

Вот dataframes и B

import pandas as pd 
import numpy as np 

A 
       Age Gender 
F_name L_name  
Josh Crammer 25 M 
John Smith 29 M 
Mellisa Simpson 32 F 
Ahemed Khan 26 M 
Frank J  25 M 
Charles Brown 26 M 
William Gibson 26 M 

B 
    F_name L_name 
0 Josh Crammer 
2 Mellisa Simpson 
4 Frank J 
5 Charles Brown 
6 William Gibson 

Что мы можем сделать, это сбросить индекс и создать столбцы в месте, как это.

A.reset_index(level=A.index.names, inplace=True) 
A 
    F_name L_name Age Gender 
0 Josh Crammer 25 M 
1 John Smith 29 M 
2 Mellisa Simpson 32 F 
3 Ahemed Khan 26 M 
4 Frank J  25 M 
5 Charles Brown 26 M 
6 William Gibson 26 M 

Все, что нужно сделать сейчас, чтобы добавить не в состоянии извлечь строки, мы требуем:

A[~((A.F_name.isin(B.F_name)) & (A.L_name.isin(B.L_name)))] 
    F_name L_name Age Gender 
1 John Smith 29 M 
3 Ahemed Khan 26 M 
+0

спасибо @abhishek – Mahesh

0

решение, используя поддельные колонки

Отказ от ответственности: Ниже вы можете найти пример «фальшивый колонке» подход, который не может подходит для огромных фреймов данных со многими соответствующими столбцами сложных типов. Кроме того, я предпочитаю работать с простыми индексами и помещать как можно больше данных в столбцы, а не в индексы.

Итак, давайте создадим два набора данных: A будет содержать несколько случайных символов Family Guy, а B будет содержать несколько членов семьи Family Guy. Надеюсь, вы знакомы с этим удивительным сериалом! :)

# Create a DF A with some Quahog Family guy citizens (with multiindex) 
multiindexA = pd.MultiIndex.from_tuples([["Peter","Griffin"],["Glenn","Quagmire"],["Joe","Swanson"],["Cleveland","Brown"],["Brian","Griffin"],["Stewie","Griffin"],["Lois","Griffin"]],names=["Name","Surname"]) 
A=pd.DataFrame([40,35,38,45,8,2,35],index=multiindexA, columns=["Age"]) 
print A 

        Age 
Name  Surname  
Peter  Griffin 40 
Glenn  Quagmire 35 
Joe  Swanson 38 
Cleveland Brown  45 
Brian  Griffin  8 
Stewie Griffin  2 
Lois  Griffin 35 


# Create a DF B with some Family guy inner family members (with simple simple index) 
B = pd.DataFrame(data=[["Peter","Griffin",40],["Lois","Griffin",35],["Brian","Griffin",8],["Stewie","Griffin",2]], columns=["Name","Surname","Age"]) 
print B 

    Name Surname Age 
0 Peter Griffin 40 
1 Lois Griffin 35 
2 Brian Griffin 8 
3 Stewie Griffin 2 

Давайте найдем персонажей Family Guy, которые не являются членами семьи Гриффинов. Во-первых, мы будем использовать reset_index нормализовать dataframes в ту же структуру, так как это собирается сделать нашу жизнь намного проще:

# Reset index to move multiindex into columns in order to normalize dataframes 
A = A.reset_index() 
print A 

     Name Surname Age 
0  Peter Griffin 40 
1  Glenn Quagmire 35 
2  Joe Swanson 38 
3 Cleveland  Brown 45 
4  Brian Griffin 8 
5  Stewie Griffin 2 
6  Lois Griffin 35 

Поскольку вы соответствия на два (или даже больше столбцов), один (возможно, грязный и память расточительство) может быть , создавая поддельный индексный столбец, объединив интересные столбцы в один с функцией .apply(lambda x: ...). Имейте в виду, что вы должны преобразовать любые не строковые поля в строках с .astype(str):.

#Create a new dummy column by merging all matching columns into one (in both dataframes!) 
A["fake_index_col"]=A[["Name","Surname","Age"]].astype(str).apply(lambda x: "".join(x),axis=1) 
B["fake_index_col"]=B[["Name","Surname","Age"]].astype(str).apply(lambda x: "".join(x),axis=1) 

Это добавит фиктивный столбец в обоих dataframe, где все данные соответствия будут сжаты в один поле ,

 Name Surname Age fake_index_col 
0  Peter Griffin 40 PeterGriffin40 
1  Glenn Quagmire 35 GlennQuagmire35 
2  Joe Swanson 38  JoeSwanson38 
3 Cleveland  Brown 45 ClevelandBrown45 
4  Brian Griffin 8  BrianGriffin8 
5  Stewie Griffin 2 StewieGriffin2 
6  Lois Griffin 35  LoisGriffin35 

Это позволит вам легко применить обратный из isin функции, чтобы найти гражданин Куахога, которые не являются грифонами. Наконец, удалите поддельный столбец и/или заново создайте multiindex, чтобы сохранить начальное состояние кадра данных.

C = A[~A["fake_index_col"].isin(B["fake_index_col"])] 
del C["fake_index_col"] 
print C 



     Name Surname Age 
1  Glenn Quagmire 35 
2  Joe Swanson 38 
3 Cleveland  Brown 45 
+0

спасибо marjan – Mahesh

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