【问题标题】:Pandas: Add new column based on comparison of two DFsPandas:根据两个 DF 的比较添加新列
【发布时间】:2017-01-12 05:54:58
【问题描述】:

我有 2 个数据框,我想将它们相互比较,并根据比较在第一个新列中添加“真/假”。

我的数据类似于:

DF1:

        cat  sub-cat    low       high
3       3        1      208       223
4       3        1      224       350
8       4        1      223       244
9       4        1      245       350
13      5        1      232       252
14      5        1      253       350

DF2:

      Cat   Sub-Cat   Rating
0     5      1           246
1     5      2           239
2     8      1           203
3     8      2           218
4     K      1           149
5     K      2           165
6     K      1           171
7     K      2           185
8     K      1           157
9     K      2           171

希望的结果是 DF2 有一个额外的列,其值为 True 或 False,这取决于基于 cat 和 sub-cat 的评级是否介于 low.min() 和 high.max() 之间,或者如果没有找到要比较的匹配项,则为 Null。

在这个问题上跑了太久,没有结果可言。

提前感谢您的帮助。

更新:

第一行看起来像:

      Cat   Sub-Cat   Rating  In-Spec
0     5      1           246    True

因为它落在最低最低价和最高最高价之间。

示例:DF1 中有两行 cat = 5 和 sub-cat = 2。我需要从这两行中获取最小低和最大高,然后检查 DF2 中第 0 行的评分是否在DF1 中两个匹配行的最小低和最大高

【问题讨论】:

  • 请告诉我们您认为第一行的结果应该是什么。
  • 当然,我很抱歉。
  • 您要评估/比较哪些行?具有相同索引的那些或具有相同 cat 和 subcat 的那些?
  • 猫/子猫是理想的比较。索引不重要
  • 你的意思是评级在行的低和行的高之间吗?因为你说low.min(),这对我来说意味着你的意思是整个专栏的最小值。你的意思是什么?

标签: python pandas


【解决方案1】:

join 发帖groupby.agg

d2 = DF2.join(
    DF1.groupby(
        ['cat', 'sub-cat']
    ).agg(dict(low='min', high='max')),
    on=['Cat', 'Sub-Cat']
)
d2

  Cat  Sub-Cat  Rating   high    low
0   5        1     246  350.0  232.0
1   5        2     239    NaN    NaN
2   8        1     203    NaN    NaN
3   8        2     218    NaN    NaN
4   K        1     149    NaN    NaN
5   K        2     165    NaN    NaN
6   K        1     171    NaN    NaN
7   K        2     185    NaN    NaN
8   K        1     157    NaN    NaN
9   K        2     171    NaN    NaN

分配.loc

DF2.loc[d2.eval('low <= Rating <= high'), 'In-Spec'] = True
DF2

  Cat  Sub-Cat  Rating In-Spec
0   5        1     246    True
1   5        2     239     NaN
2   8        1     203     NaN
3   8        2     218     NaN
4   K        1     149     NaN
5   K        2     165     NaN
6   K        1     171     NaN
7   K        2     185     NaN
8   K        1     157     NaN
9   K        2     171     NaN

【讨论】:

  • 这很漂亮。谢谢。
【解决方案2】:

根据布尔表达式添加新列将涉及以下内容:

temp = boolean code involving inequality
df2['new column name'] = temp

但是我不确定我是否理解,例如,您的 DF2 表中的第一行的评分为 246,这意味着 DF1 的第 13 行是正确的,但对于第 14 行是错误的。您希望它做什么回来?

【讨论】:

  • 一旦发现针对 cat/subcat 的结果为 true,我需要确保评级在 DF1 中相应行的最小值和最大值范围内。数据是成对出现的,比如第 13 行和第 14 行,但我需要将它们与最低低和最高高进行比较。
  • 您可以在 DF1 上使用 groupby 和 df1.groupby(['cat,'sub-cat'])[low].min()[high].max() 来创建一个新的数据框每对猫和子猫的最大值和最小值
【解决方案3】:

你可以这样做

df2['In-Spec'] = 'False'
df2['In-Spec'][(df2['Rating'] > df1['low']) & (df2['Rating'] < df1['high'])] = 'True'

但是哪些行应该相互比较呢?您希望它们按索引还是按猫和子猫名称进行比较?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多