2016-10-15 1 views
3

Ниже приведен образец гораздо большего кадра данных.Если фамилии аналогичны в столбце [Имя], заполните отсутствующие значения другого столбца

 Fare  Cabin Pclass Ticket Name 
257  86.5000  B77  1 110152 Cherry, Miss. Gladys 
759  86.5000  B77  1 110152 Rothes, the Countess. of (Lucy Noel Martha Dye... 
504  86.5000  B79  1 110152 Maioni, Miss. Roberta 
262  79.6500  E67  1 110413 Taussig, Mr. Emil 
558  79.6500  E67  1 110413 Taussig, Mrs. Emil (Tillie Mandelbaum) 
585  79.6500  NaN  1 110413 Taussig, Miss. Ruth 
475  52.0000  A14  1 110465 Clifford, Mr. George Quincy 
110  52.0000  C110 1 110465 Porter, Mr. Walter Chamberlain 
335  26.0000  C106 1 110469 Maguire, Mr. John Edward 
158  26.5500  D22  1 110489 Borebank, Mr. John James 
430  26.5500  C52  1 110564 Bjornstrom-Steffansson, Mr. Mauritz Hakan 
236  75.2500  D37  1 110813 Warren, Mr. Frank Manley 
366  75.2500  D37  1 110813 Warren, Mrs. Frank Manley (Anna Sophia Atkinson) 
191  26.0000  NaN  1 111163 Salomon, Mr. Abraham L 
170  33.5000  B19  1 111240 Van der hoef, Mr. Wyckoff 
462  38.5000  E63  1 111320 Gee, Mr. Arthur H 
329  57.9792  Nan  1 111361 Hippach, Miss. Jean Gertrude 
523  57.9792  B18  1 111361 Hippach, Mrs. Louis Albert (Ida Sophia Fischer) 

Если я хочу итерацию заполнения недостающих значений «Каюта» для людей, которые пропали без вести «Cabin» ценности, с чьим-то ценностями «кабина», только если

кто-то другое (тот, у кого есть значение кабины) имеет ту же самую фамилию, а также находится в непосредственной близости от себя (как в одном выше, либо ниже).

Таким образом, в кадре данных [Tassuig, Miss.Ruth] значение кабины «Нан» будет заменено значением кабины [Tassuig, Mrs.Emil] [E67], который является одним над собой потому что оба условия выполнены. (То же фамилия и в его окрестностях)

И недостающее значение кабины Гиппаха, мисс Жан Гертруда будет заменено на [Хиппах, миссис Луис Альберт (Ida Sophia Fischer)] Значение кабины [В18].

Я пытался придумать итерации, но это, насколько я получил

for x in df.Name.str.split(',')[x][0] ==df.Name.str.split(',')[x+1][0]: 
    if df.Cabin[x] or df.Cabin[x+1] == np.nan: 
     df.Cabin.replace(np.nan, 

Я хочу, чтобы убедиться, что np.nan значение заменяется на истинное значение и не np.nan. Не удалось выяснить, как это сделать.

Спасибо.

ответ

2

groupby + fillna

# back fills, then forward fills 
def bffill(x): 
    return x.bfill().ffill() 

# group by last name 
df['Cabin'] = df.groupby(df.Name.str.split(',').str[0]).Cabin.apply(bffill) 

df 

enter image description here

+0

Очень хорошее решение –

+0

@BobHaffner ty, ваш. – piRSquared

+0

Спасибо за решение.Таким образом, этот код группирует все аналогичные фамилии с помощью groupby, а затем выполняет функцию bffill на элементах Кабины каждой группы? Таким образом, это гарантирует, что все элементы кабины одинаковы внутри каждой группы. Я правильно понимаю это? – Moondra

3

Начиная с DataFrame

print(df)  
     Fare  Cabin Pclass Ticket \ 
    0 86.5000  B77  1 110152 
    1 86.5000  B77  1 110152 
    2 86.5000  B79  1 110152 
    3 79.6500  E67  1 110413 
    4 79.6500  E67  1 110413 
    5 79.6500  NaN  1 110413 
    6 52.0000  A14  1 110465 
    7 52.0000  C110  1 110465 
    8 26.0000  C106  1 110469 
    9 26.5500  D22  1 110489 
    10 26.5500  C52  1 110564 
    11 75.2500  D37  1 110813 
    12 75.2500  D37  1 110813 
    13 26.0000  NaN  1 111163 
    14 33.5000  B19  1 111240 
    15 38.5000  E63  1 111320 
    16 57.9792  NaN  1 111361 
    17 57.9792  B18  1 111361 

                Name 
    0        Cherry, Miss. Gladys 
    1 Rothes, the Countess. of (Lucy Noel Martha Dye... 
    2        Maioni, Miss. Roberta 
    3         Taussig, Mr. Emil 
    4    Taussig, Mrs. Emil (Tillie Mandelbaum) 
    5         Taussig, Miss. Ruth 
    6       Clifford, Mr. George Quincy 
    7      Porter, Mr. Walter Chamberlain 
    8       Maguire, Mr. John Edward 
    9       Borebank, Mr. John James 
    10   Bjornstrom-Steffansson, Mr. Mauritz Hakan 
    11       Warren, Mr. Frank Manley 
    12 Warren, Mrs. Frank Manley (Anna Sophia Atkinson) 
    13        Salomon, Mr. Abraham L 
    14       Van der hoef, Mr. Wyckoff 
    15         Gee, Mr. Arthur H 
    16      Hippach, Miss. Jean Gertrude 
    17 Hippach, Mrs. Louis Albert (Ida Sophia Fischer) 

Создание нового столбца/серии с просто LastName. Обратите внимание, может быть лучшим способом сделать это с помощью методов панды ул, но я не мог получить что-нибудь работать

df['LastName'] = df['Name'].map(lambda x : x[:x.find(',')]) 

Тогда мы использовать панд shift и логическое индексирование, чтобы увидеть, если выше пассажир имеет то же последнее имя (т.е. в случае Тоссига)

filter = (df['Cabin'].isnull()) & (df['LastName'] == df['LastName'].shift()) 
    df.loc[filter,'Cabin'] = df['Cabin'].shift() 

, а затем ниже пассажир пропускания -1 сдвига() (т.е. Hippach случай)

filter = (df['Cabin'].isnull()) & (df['LastName'] == df['LastName'].shift(-1)) 
df.loc[filter,'Cabin'] = df['Cabin'].shift(-1) 

print(df) 
     Fare  Cabin Pclass Ticket \ 
0 86.5000  B77  1 110152 
1 86.5000  B77  1 110152 
2 86.5000  B79  1 110152 
3 79.6500  E67  1 110413 
4 79.6500  E67  1 110413 
5 79.6500  E67  1 110413 
6 52.0000  A14  1 110465 
7 52.0000  C110  1 110465 
8 26.0000  C106  1 110469 
9 26.5500  D22  1 110489 
10 26.5500  C52  1 110564 
11 75.2500  D37  1 110813 
12 75.2500  D37  1 110813 
13 26.0000  NaN  1 111163 
14 33.5000  B19  1 111240 
15 38.5000  E63  1 111320 
16 57.9792  B18  1 111361 
17 57.9792  B18  1 111361 

               Name    LastName 
0        Cherry, Miss. Gladys     Cherry 
1 Rothes, the Countess. of (Lucy Noel Martha Dye...     Rothes 
2        Maioni, Miss. Roberta     Maioni 
3         Taussig, Mr. Emil     Taussig 
4    Taussig, Mrs. Emil (Tillie Mandelbaum)     Taussig 
5         Taussig, Miss. Ruth     Taussig 
6       Clifford, Mr. George Quincy    Clifford 
7      Porter, Mr. Walter Chamberlain     Porter 
8       Maguire, Mr. John Edward     Maguire 
9       Borebank, Mr. John James    Borebank 
10   Bjornstrom-Steffansson, Mr. Mauritz Hakan Bjornstrom-Steffansson 
11       Warren, Mr. Frank Manley     Warren 
12 Warren, Mrs. Frank Manley (Anna Sophia Atkinson)     Warren 
13        Salomon, Mr. Abraham L     Salomon 
14       Van der hoef, Mr. Wyckoff   Van der hoef 
15         Gee, Mr. Arthur H      Gee 
16      Hippach, Miss. Jean Gertrude     Hippach 
17 Hippach, Mrs. Louis Albert (Ida Sophia Fischer)     Hippach 
+0

Спасибо. Мне трудно понять эту часть лямбда-функции: x [: x.find (',')]). Я не могу понять, как это можно отделить от имени. – Moondra

+1

x - это str, поэтому мы можем использовать str-методы, такие как find(). find (',') находит первое вхождение запятой и возвращает свою позицию в x. Эта позиция (int) используется для нарезания x/name. Имеют смысл? постскриптум Я бы пошел с решением piRsquared –

+0

Ah! [] Используются для среза строки. Я думал, что x [] относится к фрейму данных. Спасибо за объяснение. Да, я планирую посмотреть код piRsquared, как только я понимаю ваш код. – Moondra

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

  • Нет связанных вопросов^_^