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提供一个优化的解决方案。
IIUCix
应该在这里工作
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提供一个优化的解决方案。
IIUCix
应该可以在这里工作
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将自动对齐序列。