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

2024-04-26 17:26:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

当然,我可以手动循环数据帧,但这很难看,而且可能很慢。在

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

df[df.DEFAULT][special] = default

或者

^{pr2}$

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

输入数据示例:

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]

Tags: 数据方法falsetruedefault示例df列表
3条回答

我想您可以先用列表specialdefault创建{},然后用列名称替换{}中所需的值,最后用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  

试试这个:

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

如果我正确地理解了您的问题,您只需要^{}ix也可以):

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

对于分配:

^{pr2}$

相关问题 更多 >