2017-08-02 45 views
3

我們如何替換數據框中的特定值,使替換等於這些特定值所在的第i列的順序?例如,我有此DF:用它們列的順序替換熊貓數據框中的值

A B C 
0 0 1 
1 0 0 
1 0 0 
0 1 0 
1 0 1 

在與第i列(第一,第二,第三,等等)的順序將該數據幀更換所有那些其中1的駐留,使其洛斯這樣的:

A B C 
0 0 3 
1 0 0 
1 0 0 
0 2 0 
1 0 3 

這就是我想會的工作,但事實並非如此:

DF_2= [(0 if i== 0 else j for i in DF.iloc[:,j] ) for j in range(DF.shape[1]) ] 
+0

什麼了你的代碼的回報?請包括這一點。 – SeeDerekEngineer

回答

7

如果只有10值,您可以多numpy的陣列由轉換與np.arrange

print (np.arange(1, len(df.columns)+1)) 
[1 2 3] 


print (df.values * np.arange(1, len(df.columns)+1)) 
[[0 0 3] 
[1 0 0] 
[1 0 0] 
[0 2 0] 
[1 0 3]] 

df = pd.DataFrame(df.values * np.arange(1, len(df.columns)+1), 
        index=df.index, columns=df.columns) 
print (df) 
    A B C 
0 0 0 3 
1 1 0 0 
2 1 0 0 
3 0 2 0 
4 1 0 3 

更通用的解決方案,(如果0和另一個數字)是將值轉換爲布爾:

print (df) 
    A B C 
0 0 0 4 
1 1 0 0 
2 1 0 0 
3 0 6 0 
4 1 0 1 

df = pd.DataFrame(df.astype(bool).values * np.arange(1, len(df.columns)+1), 
        index=df.index, columns=df.columns) 
print (df) 
    A B C 
0 0 0 3 
1 1 0 0 
2 1 0 0 
3 0 2 0 
4 1 0 3 

感謝您的另一個解決方案(Jon ClementsMaxU):

df = df.replace({col: {1: n} for n, col in enumerate(df.columns[1:], 2)}) 
print (df) 
    A B C 
0 0 0 3 
1 1 0 0 
2 1 0 0 
3 0 2 0 
4 1 0 3 

df = df * np.arange(1, df.shape[1]+1) 
print (df) 
    A B C 
0 0 0 3 
1 1 0 0 
2 1 0 0 
3 0 2 0 
4 1 0 3 

時序

N = 100 
cols = ['col' + str(i) for i in range(N)] 
df = pd.DataFrame(np.random.choice([0,1], size=(100000,N)), columns=cols) 
[100000 rows x 100 columns] 
#print (df) 


In [101]: %timeit pd.DataFrame(df.values * np.arange(1, len(df.columns)+1), index=df.index, columns=df.columns) 
10 loops, best of 3: 25.1 ms per loop 

In [102]: %timeit df.replace({col: {1: n} for n, col in enumerate(df.columns[1:], 2)}) 
1 loop, best of 3: 1.39 s per loop 

In [103]: %timeit df * np.arange(1, df.shape[1]+1) 
10 loops, best of 3: 21 ms per loop 

#Wen solution 
In [104]: %timeit (df.mul(list(range(1, len(df.columns)+1)))) 
10 loops, best of 3: 38.7 ms per loop 
+0

或'df.replace({col:{1:n} for n,col in enumerate(df.columns [1:],2)})' –

+0

AFAIK我們可以直接做到這一點而不需要將它轉換爲numpy數組(' .values'):'df * np.arange(1,df.shape [1] +1)' – MaxU

+0

想知道什麼是timeit的所有這些... –

2

,或者你可以試試這個(PS:你可以使用range生成listlist(range(1,df1.shape[1]+1)) )。

df.mul([1,2,3]) 
Out[433]: 
    A B C 
0 0 0 3 
1 1 0 0 
2 1 0 0 
3 0 2 0 
4 1 0 3