2017-08-02 85 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