【问题标题】:How to use pandas to filter and create a new column in a dataframe如何使用 pandas 在数据框中过滤和创建新列
【发布时间】:2021-05-02 05:00:17
【问题描述】:

我正在尝试过滤数据帧的 3 列,并为这 3 列设置条件,如果满足所有条件,则返回二进制值 1,如果不满足条件,则返回 0。下面是一个例子。

data = {'PassengerId': array([2255, 2257, 2258, 2256, 2257, 2258, 2255, 2258, 2257, 2257, 2255,
        2255, 2257, 2256, 2257, 2256, 2255, 2258, 2258, 2256, 2256, 2257,
        2258, 2258, 2257]),
 'Pclass': array([3, 2, 2, 2, 4, 3, 3, 4, 3, 1, 1, 1, 1, 2, 4, 3, 1, 2, 4, 3, 2, 3,
        1, 1, 2]),
 'Age': array([40, 33, 32, 40, 48, 24, 33, 29, 29, 31, 45, 47, 28, 32, 54, 39, 28,
        50, 40, 31, 51, 26, 41, 46, 27]),
 'SibSp': array([11, 13, 12, 19, 22, 17, 23, 12, 12, 12, 12, 24, 16, 21, 12, 15, 20,
        18, 10, 17, 20, 12, 17, 17, 10]),
 'Comf' : array([236.66883531, 235.46750709, 235.64574546, 241.16838089,
        239.40728836, 239.95592634, 236.67806901, 237.73350635,
        238.74497849, 235.17486552, 235.8457374 , 236.85133744,
        240.9359547 , 236.27703374, 237.81871052, 241.62788018,
        241.29185342, 235.0058136 , 240.69989317, 238.8073828 ,
        238.08841364, 236.55259788, 237.58108419, 239.66916186,
        241.97479544]),
 'Parch': array([232.37686437, 232.39153096, 230.56566556, 232.77980061,
        232.19436342, 232.2165835 , 232.28145641, 231.26988217,
        230.55287196, 232.26528521, 230.45185855, 230.87525326,
        231.38775744, 232.80960083, 232.33105822, 232.65782351,
        231.64457366, 230.45225829, 231.05404057, 232.38229998,
        232.57354117, 232.08690375, 230.40414215, 230.14361969,
        231.40414745]),
 'Fare': array([238.80427104, 239.32031287, 238.02212358, 238.40333494,
        238.85929097, 239.51666683, 239.87771029, 238.06772515,
        238.22734658, 238.54682118, 238.68880278, 239.79658425,
        238.2642908 , 239.22884058, 239.84423352, 239.69438831,
        238.85871719, 238.64632848, 238.7085097 , 239.5700877 ,
        239.06199698, 238.37341378, 239.16126748, 239.01280153,
        239.77047796])}

df = pd.DataFrame(data)

我试图为第一行设置一个条件,即如果“Pclass”== 1 且“Comf”介于“Parch”和“Fare”之间,则创建一个新列“Survived”并分配 1,否则分配 0 .

然后对 "Pclass" == 2, 3... 执行相同操作

我想用 pandas 来做这件事,但是这个问题的所有解决方案都是受欢迎的。

【问题讨论】:

  • PClass 2, 3 .. 的结果应该是什么?如果“Comf”在同一列“Survived”中的“Parch”和“Fare”之间,布尔值?
  • @AndrejKesely 是的,PClass 2、3 的结果......如果 PClass 为 == 2,并且“Comf”在“Parch”和“Fare”之间分配 1,则应该为 1,否则为 0,然后移动到下一个 PClass 3,如果 PClass 3 == 1 并且“Comf”在“Parch”和“Fare”之间分配 1,否则为 0。PS。这是一个行操作,PClass 和 Comf 的条件是逐行完成的。
  • 我不完全理解... PClass 只是一列。你能编辑你的问题并把预期的输出放在那里吗?

标签: python pandas dataframe conditional-statements


【解决方案1】:

如果您想对所有行执行此操作而不考虑 PClass 值,则可以使用

df["Survived"] = df["Comf"].between(df["Parch"], df["Fare"]).astype(int)

但是如果你想为特定的 PClass 做比你可以使用的

df["Survived"] = (df["Pclass"]==1 & df["Comf"].between(df["Parch"], df["Fare"])).astype(int)

【讨论】:

    【解决方案2】:

    试试这个。

    步骤。

    1. 根据您的情况获取索引。

    indexesOfTrue = df[(df["Pclass"]==1) & (df["Comf"] > df["Parch"]) & (df["Comf"] < df["Fare"])].index

    1. 使用 loc 填充索引。

    df.loc[indexesOfTrue, "Survived"] = 1

    1. 填充不真实的索引。

    df.loc[~df.index.isin(ind), "Survived"] = 0

    输出

    PassengerId  Pclass  Age  SibSp Comf       Parch        Fare  Survived
        5   2258    3   24  17  239.955926  232.216584  239.516667  2
        6   2255    3   33  23  236.678069  232.281456  239.877710  2
        7   2258    4   29  12  237.733506  231.269882  238.067725  2
        8   2257    3   29  12  238.744978  230.552872  238.227347  2
        9   2257    1   31  12  235.174866  232.265285  238.546821  1
        10  2255    1   45  12  235.845737  230.451859  238.688803  1
        11  2255    1   47  24  236.851337  230.875253  239.796584  1
        12  2257    1   28  16  240.935955  231.387757  238.264291  2
        13  2256    2   32  21  236.277034  232.809601  239.228841  2
        14  2257    4   54  12  237.818711  232.331058  239.844234  2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多