2016-03-07 30 views
1

我有這樣一個數據幀:合併多個列在一個數據幀

dataf = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'], 'C': ['c', 'c',np.nan]}) 


get_dummies(df): 

    A_a  A_b  B_a  B_b  B_c C_c 
0 1  0  0  1  0  1 
1 0  1  1  0  0  1 
2 1  0  0  0  1  0 

我想數據幀的所有共同的屬性是在一列。這裏對於屬性'a',我們有兩列,即A_a & B_a。我希望在名稱爲'a'的一列中以及值爲A_a & B_a的UNION。它應該適用於所有類似的屬性。它應該看起來像:

a  b  c 
0 1  1  1 
1 1  1  1 
2 1  0  1 

原來,我有成百上千的屬性,以百萬+行。因此一個通用公式將起作用。謝謝。

回答

0

您可以添加參數prefixprefix_sepget_dummies然後columnsgroupbysum

import pandas as pd 
import numpy as np 
import io 

dataf = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'], 'C': ['c', 'c',np.nan]}) 
print dataf 
    A B C 
0 a b c 
1 b a c 
2 a c NaN 

df = pd.get_dummies(dataf, prefix="", prefix_sep="") 
print df 
    a b a b c c 
0 1 0 0 1 0 1 
1 0 1 1 0 0 1 
2 1 0 0 0 1 0 

print df.groupby(df.columns, axis=1).sum() 
    a b c 
0 1 1 1 
1 1 1 1 
2 1 0 1 

編輯由comment,謝謝約翰·高爾特:

如果值lenght = 1(如樣品) :

df = pd.get_dummies(dataf) 
print df 
    A_a A_b B_a B_b B_c C_c 
0 1 0 0 1 0 1 
1 0 1 1 0 0 1 
2 1 0 0 0 1 0 

print df.groupby(df.columns.str[-1:], axis=1).any().astype(int) 
    a b c 
0 1 1 1 
1 1 1 1 
2 1 0 1 
+1

不使用'prefix =「」, prefix_sep =「」'你可以做,'df.groupby(df.columns.str [-1:],axis = 1).sum()'也許爲了更好的可讀性,'.any()。astype(int) ' - 這樣工會不會超過1? – Zero

+0

你說得對,但是如果改變'df'中的值,它就不起作用。 – jezrael

+0

你有一個點。我有點尖銳與多個具有相同名稱的列。 – Zero