【问题标题】:Locating a row in pandas based on a condition根据条件在熊猫中定位一行
【发布时间】:2021-06-23 12:01:48
【问题描述】:

所以这是一个常见问题,但我找不到适合这种特殊情况的答案。

所以我有一个Dataframe,其中有类型的列,例如“戏剧,西部”和一个热门编码版本的类型,所以对于戏剧和西部,两个栏目中都有一个 1,但是在哪里它只是西方类型,其 1 用于该列 0 用于戏剧。

我想要一个过滤后的数据框,其中包含只有西方而没有其他类型的行。我试图对模型进行过度采样,因为它是一个小类,但我不想增加其他类型的数量作为副产品

有多个行,所以我不能使用索引,并且有多个流派,所以我不能使用像 df[(df['Western']==1) & (df['Drama']==0) 这样的条件,而不必考虑 24 个流派。

Index | Genre           |  Drama | Western | Action | genre 4 |
   0    Drama, Western       1        1         0         0
   1    Western              0        1         0         0
   3    Action, Western      0        1         1         0

【问题讨论】:

  • 条件是什么,能不能加上预期的输出。
  • @Abhi_J 我想要一个过滤的数据框,其中包含只有西方而没有其他类型的行。我试图对模型进行过度采样,因为它是一个小类,但我不想增加其他类型的数量作为副产品。
  • onehot[onehot.Western & onehot.sum(1) == 1]

标签: python pandas dataframe conditional-statements pandas-loc


【解决方案1】:

如果你没有Genre 列,你可以这样做

df[
    (df['Western']==1)
    &
    (df[df.columns.difference(['Western'])]==0).all(axis=1)
]

【讨论】:

    【解决方案2】:

    制作一个类似于column_list = ['Western', 'Drama', 'Action', ...]的流派的column_list并找到它的总和,如果它的总和等于1,那么我们可以比较'Western'列的值是否等于1。试试这个,这应该返回只有 'Western' 为 1 的行索引:

    column_list = ['Western', 'Drama', 'Action', ...]
    df.loc[df[column_list].sum(axis=1)==1 and df['Western']==1, 'Index']
    

    【讨论】:

    • AI 也会按照我认为我必须做的事情来尝试这个,我可以从中学习,但你会在下面看到我的尴尬解决方案是多么容易......
    【解决方案3】:

    如果我正确理解您的问题,您想要那些只有“西方”为 1 的行,即类型只有西方,没有别的。

    那为什么你必须使用编码列呢?只需使用数据为字符串格式的原始“流派”列。无需将事情过度复杂化。

    new_df = df[df['Genre']=='Western']
    

    【讨论】:

    • 我不敢相信我不只是尝试这个我认为它肯定还会返回戏剧,西部等......我为这个感到尴尬......不过谢谢跨度>
    • @Goldenhigh 不用担心!我们都有过这样的时刻,当我们看不到我们面前的东西时:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2020-04-05
    • 2019-04-19
    相关资源
    最近更新 更多