2016-04-22 100 views
2

比方说,我有一个数据框df,其中包含数字列"A", "B", "C"...以及布尔列"DEFAULT"。我还有一个特殊列的列表,例如special = ["A", "D", "E", "H", ...],以及相应的默认值列表:default = [a, d, e, h, ...]。我想要做的是:对于DEFAULTTrue的每一行,将特殊列的值替换为相应的默认值。有条件地用Pandas中的默认值替换几列

当然,我可以通过数据框手动循环,但这很丑,可能很慢。

我已经试过各种直观的方式,如:

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] 
+0

你能后的'pd.DataFrame()'所以我们可以重现吗? –

+0

@Joe R,参见编辑。 – Julien

+0

为什么选择投票? – Julien

回答

1

如果我理解正确你的问题,你只需要.locix也将工作):

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 
+0

Jeez!我尝试过'.ix'和'.loc',但是像这样:'df.loc [df.DEFAULT] [special]',这没有帮助(当然是回顾!)感谢提示! – Julien

+1

不客气。第一部分('df.loc [df.DEFAULT]')是可以的,但是当您在最后选择添加[special]的列时,您正在进行链接索引,因此分配可能失败:http://pandas.pydata .ORG /大熊猫-DOCS /稳定/ indexing.html#为什么,不转让-故障时,使用链索引 – ayhan

2

我觉得你可以先创建dictionary与列表specialdefault,然后通过dictionarydf的列名和最后replace他们更换所需值:

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 
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