【问题标题】:Using the condition, select the desired columns in pandas DataFrame使用条件,在 pandas DataFrame 中选择所需的列
【发布时间】:2018-11-16 08:30:12
【问题描述】:

我有一个使用 pandas 创建的 DataFrame,并希望根据原始表创建新表,但根据某些条件进行过滤。

df = pd.DataFrame(
    [['Y', 'Cat', 'no', 'yes', 6],
    ['Y', 4, 7, 9, 'dog'],
    ['N', 6, 4, 6, 'pig'],
    ['N', 3, 6, 'beer', 8]],
    columns = ('Data', 'a', 'b', 'c', 'd')
)

我的条件不起作用:

if (df['Data']=='Y') & (df['Data']=='N'):
    df3=df.loc[:,['Data', 'a', 'b', 'c']]
else:
    df3=df.loc[:,['Data', 'a', 'b']]

我希望新表包含符合以下条件的数据:

如果df.Data 的值为“Y”和“N”,则新表获取列('Data', 'a', 'b')

如果没有,新表获取列('Data', 'a', 'b', 'c')

 Data    a   b
0    Y  Cat  no
1    Y    4   7
2    N    6   4
3    N    3   6

  Data    a   b     c
0    Y  Cat  no   yes
1    Y    4   7     9
2    Y    6   4     6
3    Y    3   6  beer

【问题讨论】:

  • 您的第一个输出有YN,但没有c 列,而第二个输出只有Y,但它有c 列。这与您的口头描述不同。
  • 是的,感谢您的评论。我编辑了它。

标签: python pandas conditional-statements


【解决方案1】:
if all(df.Data.unique() == ['Y','N']) == True:
    df3 = df[['Data', 'a', 'b', 'c']]
else:
    df3 = df[['Data','a','b']]

【讨论】:

  • 虽然这可能有效,但值得注意的是,这更加宽松。例如,“Y”和“O”也满足条件。你也可以使用pd.Series.nunique这个方法。
【解决方案2】:

您正在比较一个系列与一个字符,而不是检查单个布尔结果的存在。相反,您可以使用pd.Series.any,如果系列中的任何值为True,则返回True

if (df['Data']=='Y').any() & (df['Data']=='N').any():
    # do something

另一种方法是将pd.DataFrame.drop 与三元语句一起使用:

df = df.drop(['d'] if set(df['Data']) == {'Y', 'N'} else ['c', 'd'], 1)

print(df)

  Data    a   b     c
0    Y  Cat  no   yes
1    Y    4   7     9
2    N    6   4     6
3    N    3   6  beer

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 2016-10-06
    • 2015-03-22
    • 2017-09-23
    • 2019-05-25
    • 2021-05-07
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多