2016-07-02 2 views
1

Я делаю решар на кадре данных для людей, которые являются относительными. Но я не могу справиться, когда найду братьев, я не могу найти способ записать их на определенную колонку. Вот последовать примеру:Python Pandas: Как мне возвращать члены groupby

cols = ['Name','Father','Brother'] 
df = pd.DataFrame({'Brother':'', 
        'Father':['Erick Moon','Ralph Docker','Erick Moon','Stewart Adborn'], 
        'Name':['John Smith','Rodolph Ruppert','Mathew Common',"Patrick French"]     
        },columns=cols) 

df 
      Name   Father   Brother 
0  John Smith Erick Moon   
1 Rodolph Ruppert Ralph Docker   
2 Mathew Common Erick Moon   
3 Patrick French Stewart Adborn 

То, что я хочу это:

  Name   Father   Brother 
0  John Smith Erick Moon  Mathew Common  
1 Rodolph Ruppert Ralph Docker   
2 Mathew Common Erick Moon  John Smith 
3 Patrick French Stewart Adborn 

Я apreciate любую помощь!

+1

ли этот набор данных включают только мужчин? Может ли быть более двух братьев? – ayhan

+0

Это может быть полезно: http://pandas.pydata.org/pandas-docs/stable/reshaping.html –

+0

Нет. Я просто сделал псевдокод. Есть женщины тоже. Кроме того, возможно более двух братьев. Я передумаю. Я попробовал groupby, но мне не удалось получить только другого брата, потому что он будет переписываться дважды ... – nicmano

ответ

1

Вот эта идея, которую вы можете попробовать, во-первых, создайте столбец Brother со всеми братьями в качестве списка, включая себя, а затем удалите его отдельно. Код, вероятно, может быть оптимизирован, но где вы можете начать с:.

import numpy as np 
import pandas as pd 
df['Brother'] = df.groupby('Father')['Name'].transform(lambda g: [g.values]) 
def deleteSelf(row): 
    row.Brother = np.delete(row.Brother, np.where(row.Brother == row.Name)) 
    return(row) 
df.apply(deleteSelf, axis = 1) 

#    Name   Father   Brother 
# 0  John Smith  Erick Moon [Mathew Common] 
# 1 Rodolph Ruppert Ralph Docker    [] 
# 2 Mathew Common  Erick Moon  [John Smith] 
# 3 Patrick French Stewart Adborn    [] 
+0

Он отлично работает! Я думаю о очень адекватном решении! – nicmano

0
def same_father(me, data): 
    hasdad = data.Father == data.at[me, 'Father'] 
    notme = data.index != me 
    isbro = hasdad & notme 
    return data.loc[isbro].index.tolist() 

df2 = df.set_index('Name') 
getbro = lambda x: same_father(x.name, df2) 
df2['Brother'] = df2.apply(getbro, axis=1) 

Я думаю, что это должно работать (непроверенные)

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