2017-10-18 1 views
1

私は、名前と番号の2つの列を持つデータフレームを持っています。番号列に基づいてすべての名前をグループ化し、番号1のすべての名前と番号2の名前などのテーブル形式でデータを印刷します。例えば 、 入力された場合:腸内の数が異なる印刷テーブル

name = ['Bob','David','Jane','Mike','Josh','Emily'] 
number = [1,2,3,1,2,1] 
df = pd.DataFrame([name,number]).T 
df.columns = ['name','number'] 

所望の出力(うまくいけばかなり良く見える):

num1  num2 num3 

Bob   David  Jane 

Mike   Josh  

Emily     

答えて

2

コールgroupbynumberのグループ、辞書に変換し、再作成、あなたのデータフレーム。

d = df.groupby('number').name.apply(list).to_dict() 

df = pd.DataFrame({k : pd.Series(v) 
     for k, v in d.items()}).add_prefix('num').fillna('') 

print(df) 
    num1 num2 num3 
0 Bob David Jane 
1 Mike Josh  
2 Emily 
+0

あなたは私の目のオプションが機能することを確認することはできますか?ありがとう – piRSquared

+0

@piRSquared、私はあなたのPCに戻ってきたときにそれをしますか? –

1

cumcountunstackで使用set_indexSerieslistのSに

df1 = (df.set_index([df.groupby('number').cumcount(),'number'])['name'] 
     .unstack(fill_value='') 
     .add_prefix('num') 
     .rename_axis(None, 1)) 
print (df1) 
    num1 num2 num3 
0 Bob David Jane 
1 Mike Josh  
2 Emily 

代替:

a = df.groupby('number')['name'].apply(list) 
a.index.name = None 
print (a) 
1 [Bob, Mike, Emily] 
2   [David, Josh] 
3    [Jane] 
Name: name, dtype: object 

df1 = pd.DataFrame(a.values.tolist(), index=a.index).T.add_prefix('num').fillna('') 
print (df1) 
    num1 num2 num3 
0 Bob David Jane 
1 Mike Josh  
2 Emily   
3

オプション1
使用defaultdict

from collections import defaultdict 

d = defaultdict(list) 
f = 'num{}'.format 

for nm, nb in zip(df.name, df.number): 
    d[f(nb)].append(nm) 

pd.DataFrame.from_dict(d, orient='index').T.fillna('') 

    num1 num2 num3 
0 Bob David Jane 
1 Mike Josh  
2 Emily    

オプション2

i = df.groupby('number').cumcount().values 
j, c = pd.factorize(df.number.values) 

a = np.empty((i.max() + 1, c.size), dtype='<U32') 
a.fill('') 
a[i, j] = df.name.values 

pd.DataFrame(a, columns=c).add_prefix('num') 

    num1 num2 num3 
0 Bob David Jane 
1 Mike Josh  
2 Emily  
+0

残念ながら、 'a [i、j] = df.name.values' - >' [['' B 'D' 'J]] [' M '' J ''] ['E' ' '' ']] 'となるので、出力はnum1 num2 num3 0 BDJ 1 MJ 2 E' – jezrael

+0

ValueError:渡された値の形状は(2,4)、インデックスは最後に(3、4)を意味しますライン。 –

+0

FIFY。 :-)それは完璧に動作します。 –

関連する問題