【问题标题】:Compare values under multiple conditions of one column in Python在Python中比较一列的多个条件下的值
【发布时间】:2018-12-29 07:08:40
【问题描述】:

我有以下数据:

data = {
    "index": [1, 2, 3, 4, 5],
    "name": ["A", "A", "B", "B", "B"],
    "type": ['s1', 's2', 's1', 's2', 's3'],
    'value': [20, 10, 18, 32, 25]
}
df = pd.DataFrame(data)

我需要检查同名下的值是否遵循约束(例如只有三种类型,并且并非都存在于同名下):s1

    index   name    type    value   result
0     1      A       s1      20      False
1     2      A       s2      10        
2     3      B       s1      18      True
3     4      B       s2      32      False
4     5      B       s3      25        

我如何在 Python 中做到这一点?感谢您的帮助。

【问题讨论】:

  • 你已经尝试了什么?请添加一些代码
  • 为什么有些行有破折号而其他行有Falses?计算每个result的公式/算法是什么?
  • @DYZ 例如,在 A 下只有 s1。如果你愿意,它会返回破折号或 NaN。
  • 您的问题不清楚。 例如还不够好。 TrueFalse 和破折号的条件究竟是什么 - 分别针对每个结果?一旦有了公式,就很容易编写代码。
  • @meW 这只是一个有根据的猜测。我宁愿知道 OP 的想法。

标签: python pandas


【解决方案1】:

试试:

#Use pd.Categorical to ensure sorting if column is not lexicographical ordered.
df['type'] = pd.Categorical(df['type'], ordered=True, categories=['s1','s2','s3'])

df['result'] = df.sort_values('type').groupby('name')['value'].diff(-1)

df['result'] = df['result'].lt(0).mask(df['result'].isna(),'')

df

输出:

   index name type  value result
0      1    A   s1     20  False
1      2    A   s2     10       
2      3    B   s1     18   True
3      4    B   s2     32  False
4      5    B   s3     25       

【讨论】:

  • 为什么sort_values('type')。答案仍然没有它。我错过了什么吗?
  • 如果数据框没有按类型排序,则 diff 将无法正常工作。 Diff(-1) 获取当前行并减去下一行,无论排序如何。因此,要在 s1
猜你喜欢
  • 2015-07-08
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多