假设我的数据框df
包含数字列"A", "B", "C"...
以及布尔列"DEFAULT"
。我还有一个特殊列的列表,例如special = ["A", "D", "E", "H", ...]
,以及相应默认值的列表:default = [a, d, e, h, ...]
。我想要做的是:对于DEFAULT
为True
的每一行,请使用相应的默认值替换特殊列的值。
当然我可以手动循环数据框来执行此操作,但这很丑陋且可能很慢。
我尝试过各种直观的方法,如:
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 :(得分:2)
我认为您可以先使用列表dictionary
和special
创建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)
如果我正确理解了您的问题,您只需要add(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
对于作业:
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