【问题标题】:Why when I use groupby on two columns the result is NaN but when I do it on one column it works correctly为什么当我在两列上使用 groupby 时结果是 NaN 但是当我在一列上使用它时它可以正常工作
【发布时间】:2022-01-05 16:22:59
【问题描述】:

我使用以下数据框

df = pd.DataFrame({'class': 'a a aa aa b b '.split(),
                    'item': [5,5,7,7,7,6],
                   'last_PO_code': ['103','103','103','104','103','104'],
                   'qty': [5,4,7,6,7,6]
                   })

我在上面应用这个规则

regle1 = lambda x: True if x['last_PO_code'].all() == "103" else False

像这样在grouby上有一栏

df['regle1'] = df['class'].map(df.groupby(['class']).apply(regle1))

我有以下结果,很好


class   item    last_PO_code    qty regle1
0   a   5       103             5   True
1   a   5       103             4   True
2   aa  7       103             7   False
3   aa  7       104             6   False
4   b   7       103             7   False
5   b   6       104             6   False

但是当我想按类和项目分组时,我有这个结果

df['regle1'] = df['class'].map(df.groupby(['class','item']).apply(regle1))

class   item    last_PO_code    qty regle1
0   a   5       103             5   NaN
1   a   5       103             4   NaN
2   aa  7       103             7   NaN
3   aa  7       104             6   NaN
4   b   7       103             7   NaN
5   b   6       104             6   NaN

有人可以帮我理解吗??

【问题讨论】:

  • 当您groupby 两列时,您的结果索引现在是一个多索引。这意味着当您只是map 类列时没有匹配项,因为您的索引实际上是元组(类,项)。相反,您应该 merge 返回结果,以便它在类和项目上都匹配,或者您可以使用 groupby + transform 将结果广播回正确的行

标签: python pandas dataframe dictionary pandas-groupby


【解决方案1】:

您似乎正在寻找 groupby+transform,但试图通过 pd.Series.map 实现它。

df = pd.DataFrame({'class': 'a a aa aa b b '.split(),
                    'item': [5,5,7,7,7,6],
                   'last_PO_code': ['103','103','103','104','103','104'],
                   'qty': [5,4,7,6,7,6]
                   })
def regle1(x):
  return (x == '103').all()

df['regle1'] = df.groupby(['class', 'item']).last_PO_code.transform(regle1)

最终的数据框现在看起来像这样:

  class  item last_PO_code  qty  regle1
0     a     5          103    5    True
1     a     5          103    4    True
2    aa     7          103    7   False
3    aa     7          104    6   False
4     b     7          103    7    True
5     b     6          104    6   False

【讨论】:

  • 感谢您的帮助,它有很大帮助,现在我的问题是我找不到第二条规则的函数 eq() 的等价物`regle2 = lambda x: x.loc[x['last_PO_code'].eq('103'), 'qty'].sum() > x.loc[x['last_PO_code'].eq('104'), 'qty'].sum()
  • @LyèsSARDI,您能否提出自己的问题,并附上所有详细信息,如示例数据、您尝试了什么、您期望什么等。
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多