2016-06-20 8 views
4

私のデータフレームに重複する列名はほとんどありません。列の名前が重複している場合は、重複する列を1つに結合します。私はまた、重複する列のデータをコンマで区切って保持したい。誰でもこれを行う方法を提案してもらえますか?Pandas dataframe重複する列をカンマで1つの別のデータに結合します。

私は以下の例を構築しました。私の実際のデータフレームでは、列名は不明です。

入力DATAFRAME:

Col1 Col2 Col3 Col2 
A CA1 CA5 CA3 CA5 
B CB1 CB5 CB3 CB5 
C CC1 CC5 CC3 CC5 
D CD1 CD5 CD3 None 
E CE1 CE5 CE3 CE5 

で読み取ることができます:

df = pd.read_clipboard(names=['Col1','Col2','Col3','Col2'], skiprows=1) 

出力DATAFRAME:

Col1  Col2 Col3 
A CA1 CA5,CA5 CA3 
B CB1 CB5,CB5 CB3 
C CC1 CC5,CC5 CC3 
D CD1 CD5 CD3 
E CE1 CE5,CE5 CE3 

答えて

4

あなたもできます。詳しくは

df.groupby(df.columns, axis=1).agg(lambda x: ','.join(x.values))) 

     Col1  Col2 Col3 
Index     
A  CA1 CA2,CA5 CA3 
B  CB1 CB2,CB5 CB3 
C  CC1 CC2,CC5 CC3 
D  CD1 CD2,CD5 CD3 
E  CE1 CE2,CE5 CE3 

を:使用グループ重複へdf.columns上:

df.groupby(df.columns, axis=1).apply(lambda x: x.info()) 

<class 'pandas.core.frame.DataFrame'> 
Index: 5 entries, A to E 
Data columns (total 1 columns): 
Col1 5 non-null object 
dtypes: object(1) 
memory usage: 80.0+ bytes 
<class 'pandas.core.frame.DataFrame'> 
Index: 5 entries, A to E 
Data columns (total 2 columns): 
Col2 5 non-null object 
Col2 5 non-null object 
dtypes: object(2) 
memory usage: 120.0+ bytes 
<class 'pandas.core.frame.DataFrame'> 
Index: 5 entries, A to E 
Data columns (total 1 columns): 
Col3 5 non-null object 
dtypes: object(1) 

、その後、次のようになりgrouped列に.valuesを崩壊し','.join().agg()を使用します。

df.groupby(df.columns, axis=1).apply(lambda x: x.values) 

Col1     [[CA1], [CB1], [CC1], [CD1], [CE1]] 
Col2 [[CA5, CA5], [CB5, CB5], [CC5, CC5], [CD5, CD5... 
Col3     [[CA3], [CB3], [CC3], [CD3], [CE3]] 

列のみを複製するので、より多くを持っています

 Col1  Col2 Col3 
Index     
A  CA1 CA5,CA5 CA3 
B  CB1 CB5,CB5 CB3 
C  CC1 CC5,CC5 CC3 
D  CD1 CD5,CD5 CD3 
E  CE1 CE5,CE5 CE3 

付:あなたが得るように、単一の値は、彼らだけでは、結合されますあなたはできるNone型の値、:

df.groupby(df.columns, axis=1).apply(lambda x: x.apply(lambda y: ','.join([l for l in y if l is not None]), axis=1)) 

取得する:

 Col1  Col2 Col3 
Index     
A  CA1 CA5,CA5 CA3 
B  CB1 CB5,CB5 CB3 
C  CC1 CC5,CC5 CC3 
D  CD1  CD5 CD3 
E  CE1 CE5,CE5 CE3 
+0

そうです、 '.values'がありませんでした、ごめんなさい。 – Stefan

+0

詳細を更新しました。 – Stefan

+0

ステファンありがとう、はい。値がありませんでした。私の実際のデータフレームには、エラーを投げているという理由でNone値があります。あなたはこれを並べ替える方法を知っていますか? 私は上記の質問でこれを更新しました。 – Rtut

4

あなたはこのようにそれを行うことができます。

df.T.groupby(level=0).agg(','.join).T 

データ:

In [207]: df 
Out[207]: 
     Col1 Col2 Col1 Col2 Col3 
Index 
A  CA1 CA2 CA3 CA5 ZA1 
B  CB1 CB2 CB3 CB5 ZA2 
C  CC1 CC2 CC3 CC5 ZA3 
D  CD1 CD2 CD3 CD5 ZA4 
E  CE1 CE2 CE3 CE5 ZA5 

出力:

In [208]: df.T.groupby(level=0).agg(','.join).T 
Out[208]: 
      Col1  Col2 Col3 
Index 
A  CA1,CA3 CA2,CA5 ZA1 
B  CB1,CB3 CB2,CB5 ZA2 
C  CC1,CC3 CC2,CC5 ZA3 
D  CD1,CD3 CD2,CD5 ZA4 
E  CE1,CE3 CE2,CE5 ZA5 

説明:

In [209]: df.T 
Out[209]: 
Index A B C D E 
Col1 CA1 CB1 CC1 CD1 CE1 
Col2 CA2 CB2 CC2 CD2 CE2 
Col1 CA3 CB3 CC3 CD3 CE3 
Col2 CA5 CB5 CC5 CD5 CE5 
Col3 ZA1 ZA2 ZA3 ZA4 ZA5 

In [210]: df.T.groupby(level=0).agg(','.join) 
Out[210]: 
Index  A  B  C  D  E 
Col1 CA1,CA3 CB1,CB3 CC1,CC3 CD1,CD3 CE1,CE3 
Col2 CA2,CA5 CB2,CB5 CC2,CC5 CD2,CD5 CE2,CE5 
Col3  ZA1  ZA2  ZA3  ZA4  ZA5 
+0

これは、ほとんどの "パンダ-thonic" ソリューションです。 – andrew

+0

あなたの記事を読んだ後、私の答えを削除しなければなりませんでした:P – hashcode55

1

私はこれを投稿して恥ずかしいです。しかし、それは動作します。

df = pd.DataFrame(np.random.choice(('a', 'b', 'c'), (5, 4)), list('ABCDE'), ['Col1', 'Col2', 'Col3', 'Col2']) 

pd.concat([pd.DataFrame(c) for i, c in df.iteritems()], axis=1, keys=range(len(df.columns))).swaplevel(0, 1, 1).sort_index(1).groupby(level=0, axis=1).apply(lambda df: df.apply(lambda x: ','.join(x.values), axis=1)) 

少し壊れました。

df2 = pd.concat([pd.DataFrame(c) for i, c in df.iteritems()], 
       axis=1, keys=range(len(df.columns))) 

a1 = lambda df: df.apply(lambda x: ','.join(x.values), axis=1) 
gb = df2.swaplevel(0, 1, 1).sort_index(1).groupby(level=0, axis=1) 
gb.apply(a1) 

    Col1 Col2 Col3 
A a c,b a 
B a c,c c 
C a a,b b 
D b c,c a 
E a c,b a 
関連する問題