Python 如何基于DataFrame下的其他列有条件地选择列,而不使用where函数?

Python 如何基于DataFrame下的其他列有条件地选择列,而不使用where函数?,python,pandas,python-2.5,Python,Pandas,Python 2.5,我在Python2.5下工作(由于外部api的限制,我只能使用该版本),希望得到与我在Python2.7下编写的代码相同的结果 import pandas as pd df = pd.DataFrame({"lineId":[1,2,3,4], "idCaseMin": [10, 23, 40, 8], "min": [-110, -205, -80, -150], "idCaseMax": [5, 27, 15, 11], "max": [120, 150, 110, 90]}) df = d

我在
Python2.5
下工作(由于外部api的限制,我只能使用该版本),希望得到与我在
Python2.7
下编写的代码相同的结果

import pandas as pd
df = pd.DataFrame({"lineId":[1,2,3,4], "idCaseMin": [10, 23, 40, 8], "min": [-110, -205, -80, -150], "idCaseMax": [5, 27, 15, 11], "max": [120, 150, 110, 90]})
df = df.set_index("lineId")

df["idMax"] = df["idCaseMax"].where(df["max"]>abs(df["min"]),df["idCaseMin"])
数据帧的结果是:

>>> df
        idCaseMax  max  idCaseMin  min  idMax
lineId                                       
1               5   10        120 -110      5
2              27   23        150 -205     23
3              15   40        110  -80     15
4              11    8         90 -150      8
idMax
列是根据绝对模块中
max
min
列中获取最大值的id定义的

我无法使用
where
函数,因为它在
pandas 0.9.0
(最新版本适用于
python 2.5
)和
numpy 1.7.1
下不可用


那么,在不使用
pandas
where
函数的情况下,我必须为
idMax
列获得相同的结果,哪些选项?

我们可以使用
apply
函数,如下代码尝试相同的结果:

df["idMax"] = df.apply(lambda row: row["idCaseMax"] if row["max"]>abs(row["min"]) else row["idCaseMin"], axis = 1)

我们可以使用下面代码中的
apply
功能尝试相同的结果:

df["idMax"] = df.apply(lambda row: row["idCaseMax"] if row["max"]>abs(row["min"]) else row["idCaseMin"], axis = 1)
IIUC您可以使用:

[120]中的
df['idMax']=\
np.其中(df[“max”]IIUC您可以使用:

[120]中的
df['idMax']=\

np.where(df[“max”]我将尝试为
0.9提供一个优化的解决方案。
IIUC
ix
应该在这里工作

m = df["max"] > df["min"].abs()

i = df.ix[m, 'idCaseMax']
j = df.ix[~m, 'idCaseMin']

df['idMax'] = i.append(j)
df

        idCaseMax  idCaseMin  max  min  idMax
lineId
1               5         10  120 -110      5
2              27         23  150 -205     23
3              15         40  110  -80     15
4              11          8   90 -150      8

我将尝试为
0.9提供一个优化的解决方案。
IIUC
ix
应该可以在这里工作

m = df["max"] > df["min"].abs()

i = df.ix[m, 'idCaseMax']
j = df.ix[~m, 'idCaseMin']

df['idMax'] = i.append(j)
df

        idCaseMax  idCaseMin  max  min  idMax
lineId
1               5         10  120 -110      5
2              27         23  150 -205     23
3              15         40  110  -80     15
4              11          8   90 -150      8

你的熊猫应该有这个

df['idMax']=(df["max"]>abs(df["min"]))* df["idCaseMax"]+(df["max"]<=abs(df["min"]))* df["idCaseMin"]
df
Out[1388]: 
        idCaseMax  idCaseMin  max  min  idMax
lineId                                       
1               5         10  120 -110      5
2              27         23  150 -205     23
3              15         40  110  -80     15
4              11          8   90 -150      8

df['idMax']=(df[“max”]>abs(df[“min”])*df[“idCaseMax”]+(df[“max”]你的熊猫应该有这个

df['idMax']=(df["max"]>abs(df["min"]))* df["idCaseMax"]+(df["max"]<=abs(df["min"]))* df["idCaseMin"]
df
Out[1388]: 
        idCaseMax  idCaseMin  max  min  idMax
lineId                                       
1               5         10  120 -110      5
2              27         23  150 -205     23
3              15         40  110  -80     15
4              11          8   90 -150      8

df['idMax']=(df[“max”]>abs(df[“min”])*df[“idCaseMax”]+(df[“max”]@cᴏʟᴅsᴘᴇᴇᴅ, 我认为Numpy where应该在哪里?或者我错了吗?是的,Numpy where子句在
Numpy 1.7.1
version i have;)@c下ᴏʟᴅsᴘᴇᴇᴅ, 为什么?这是一个有效的解决方案,与
相比速度更快。应用(…,axis=1)
基于可读性,我将选择此答案。我发现代码在这里做什么很清楚。与计时相关,我发现这种方式也是最快的。执行耗时0.0秒(与迄今为止所述的所有其他解决方案相比,例如,我的解决方案耗时0.001秒)@CedricZoppolo在更大的数据上测试它:p@cᴏʟᴅsᴘᴇᴇᴅ, 我认为Numpy where应该在哪里?或者我错了吗?是的,Numpy where子句在
Numpy 1.7.1
version i have;)@c下ᴏʟᴅsᴘᴇᴇᴅ, 为什么?这是一个有效的解决方案,与
相比速度更快。应用(…,axis=1)
基于可读性,我将选择此答案。我发现代码在这里做什么很清楚。与计时相关,我发现这种方式也是最快的。执行耗时0.0秒(与到目前为止所述的所有其他解决方案相比,例如,我的解决方案花费了0.001秒)@CedricZoppolo在更大的数据上测试它。:pHuh,你甚至不需要
sort\u index
调用,pandas将自动对齐序列。哈,你甚至不需要
sort\u index
调用,pandas将自动对齐序列。