使用Pandas中的默认值有条件地替换多个列

时间:2016-04-22 05:02:08

标签: python pandas

假设我的数据框df包含数字列"A", "B", "C"...以及布尔列"DEFAULT"。我还有一个特殊列的列表,例如special = ["A", "D", "E", "H", ...],以及相应默认值的列表:default = [a, d, e, h, ...]。我想要做的是:对于DEFAULTTrue的每一行,请使用相应的默认值替换特殊列的值。

当然我可以手动循环数据框来执行此操作,但这很丑陋且可能很慢。

我尝试过各种直观的方法,如:

df[df.DEFAULT][special] = default

df[special] = df[special].where(not df.DEFAULT, default, axis = 1)

但我的尝试都没有奏效。我也读了很多类似的问题,但似乎没有一个对我有用。对不起,如果我错过了正确的。

输入数据示例:

df = pd.DataFrame(np.random.rand(10,10))
df.columns = list('ABCDEFGHIJ')
df["DEFAULT"] = [False,False,True,False,True,False,False,True,True,False]
special = list("ADGI")
default = [1,2,3,4]

3 个答案:

答案 0 :(得分:2)

我认为您可以先使用列表dictionaryspecial创建default,然后将df中的所需值替换为列名称,将replace替换为dictionary maping = dict(zip(special,default)) print maping {'A': 1, 'I': 4, 'D': 2, 'G': 3} df.loc[df.DEFAULT, special] = special df = df.replace(maping) print df A B C D E F G \ 0 0.518990 0.066074 0.472414 0.438256 0.202796 0.423588 0.357758 1 0.522062 0.035160 0.906231 0.816364 0.552581 0.851809 0.962395 2 1.000000 0.603323 0.128021 2.000000 0.002065 0.198911 3.000000 3 0.947822 0.728559 0.329651 0.791761 0.108166 0.392319 0.221218 4 1.000000 0.506343 0.349898 2.000000 0.024577 0.633987 3.000000 5 0.316550 0.826805 0.103991 0.633982 0.751032 0.155978 0.426002 6 0.590585 0.435532 0.798689 0.923456 0.299154 0.388404 0.486272 7 1.000000 0.263768 0.944626 2.000000 0.720266 0.925395 3.000000 8 1.000000 0.649534 0.927976 2.000000 0.816151 0.911451 3.000000 9 0.668218 0.286717 0.019462 0.399222 0.308528 0.942185 0.888265 H I J DEFAULT 0 0.163684 0.441374 0.262800 False 1 0.110522 0.630832 0.997994 False 2 0.330441 4.000000 0.280859 True 3 0.683726 0.102446 0.397026 False 4 0.268709 4.000000 0.955568 True 5 0.892707 0.103578 0.018096 False 6 0.588151 0.983854 0.697330 False 7 0.423054 4.000000 0.367475 True 8 0.369524 4.000000 0.560451 True 9 0.860311 0.653000 0.344289 False

{{1}}

答案 1 :(得分:1)

如果我正确理解了您的问题,您只需要addix也可以):

df.loc[df.DEFAULT, special]
Out[40]: 
          A         D         G         I
2  0.629427  0.532373  0.529779  0.274649
4  0.226196  0.467896  0.851469  0.971351
7  0.666459  0.351840  0.414972  0.451190
8  0.238104  0.277630  0.943198  0.293356

对于作业:

df.loc[df.DEFAULT, special] = default

df
Out[44]: 
          A         B         C         D         E         F         G  \
0  0.513798  0.138073  0.685051  0.173045  0.964050  0.245352  0.360657   
1  0.286920  0.464747  0.301910  0.857810  0.957686  0.684297  0.381671   
2  1.000000  0.454802  0.707585  2.000000  0.777142  0.738670  3.000000   
3  0.894643  0.987747  0.162569  0.430214  0.205933  0.651764  0.361578   
4  1.000000  0.859582  0.014823  2.000000  0.658297  0.875474  3.000000   
5  0.075581  0.848288  0.819145  0.429341  0.718035  0.275785  0.951492   
6  0.984910  0.858093  0.665032  0.138201  0.006561  0.282801  0.050243   
7  1.000000  0.215375  0.594164  2.000000  0.666909  0.598950  3.000000   
8  1.000000  0.931840  0.568436  2.000000  0.911106  0.727052  3.000000   
9  0.140491  0.181527  0.436082  0.617412  0.468370  0.496973  0.426825   

          H         I         J DEFAULT  
0  0.964239  0.422831  0.660515   False  
1  0.650808  0.112612  0.897050   False  
2  0.537366  4.000000  0.243392    True  
3  0.377302  0.341089  0.488061   False  
4  0.074656  4.000000  0.317079    True  
5  0.990471  0.634703  0.141121   False  
6  0.026650  0.731152  0.589984   False  
7  0.570956  4.000000  0.762232    True  
8  0.828288  4.000000  0.359620    True  
9  0.701504  0.050273  0.427838   False  

答案 2 :(得分:0)

试试这个:

import pandas as pd
import numpy as np



df2 = pd.DataFrame({ 'Num A' : [1.,2.7, 3.4], 
                     'Def A' : [-1.,-2.7, -3.4], 
                     'DEFAULT' : [True, False, True]})

print df2  

df2.loc[df2['DEFAULT']==True, 'Num A']=df2.loc[df2['DEFAULT']==True, 'Def A']

print df2