使用Pandas查找分组行的最小值

时间:2017-01-03 19:30:52

标签: python pandas numpy dataframe

这可能是一个微不足道的问题,但我仍在试图找出大熊猫/ numpy。

所以,假设我有一个具有以下结构的表:

group_id | col1 | col2 | col3 |  "A"   |  "B"
   x     |   1  |   2  |  3   |  NaN   |   1
   x     |   3  |   2  |  3   |   1    |   1 
   x     |   4  |   2  |  3   |   2    |   1
   y     |   1  |   2  |  3   |  NaN   |   3 
   y     |   3  |   2  |  3   |   3    |   3 
   z     |   3  |   2  |  3   |   10   |   2
   z     |   2  |   2  |  3   |   6    |   2
   z     |   4  |   2  |  3   |   4    |   2
   z     |   4  |   2  |  3   |   2    |   2

请注意,有一个group_id可以对每行中的元素进行分组。 所以在开始时,我有列group_id和col1-col3的值。

然后对于每一行,如果col1,col2或col3的值= 1,那么" A"是NaN,否则该值基于公式(与此处无关,因此我放置了一些数字)。

那,我知道如何使用:

df["A"] = np.where(((df['col1'] == 1)|(df['col2']== 1) | (df['col3']) == 1))), NaN, value)

但是对于列" B",我需要用特定组的A列中的最小值填充它。

例如," B"等于" 1"对于具有组X的所有行,因为列A中的所有组的最小值" x"行等于1.

类似地,对于组" y"中的行,最小值为3,对于组" z"最小值是2.我究竟是如何使用熊猫那样做的?这让我更加困惑,因为特定组的行数可能有不同的大小。

如果它们的大小都相同,我可以说用预设范围内的最小值填充它。

我希望这是有道理的;如果我应该提供一个更清晰的例子或澄清任何事情,请告诉我!

3 个答案:

答案 0 :(得分:6)

要获得每个组的A列最小值,请使用transform

df.groupby('group_id')['A'].transform('min')

答案 1 :(得分:1)

  • 专注于['col1', 'col2', 'col3']
  • 查看它们是否等于1 eq(1)相当于== 1
  • 查看axis=1any(1)
  • 之间是否有任何一个
  • 使用loc进行作业
anyone = df[['col1', 'col2', 'col3']].eq(1).any(1)
df.loc[anyone, 'A'] = np.nan

numpy equivalent

anyone = (df[['col1', 'col2', 'col3']].values == 1).any(1)
df.A = np.where(anyone, np.nan, df.A)

答案 2 :(得分:1)

df.groupby('group_id')['A'].min()