繁体   English   中英

如何在不使用where函数的情况下基于pandas DataFrame下的其他列有条件地选择列?

[英]How to conditionally select column based on other columns under pandas DataFrame without using where function?

我正在python 2.5下工作(由于外部api,我限于该版本),并希望获得与我在python 2.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"])

DataFrame导致:

>>> 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列是根据id定义的,该id在maxmin列中的绝对模块中获得max

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

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

IIUC您可以使用numpy.where()

In [120]: df['idMax'] =  \
              np.where(df["max"]<=abs(df["min"]),
                       df["idCaseMin"],
                       df["idCaseMax"])

In [121]: df
Out[121]:
        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.提供优化的解决方案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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM