当有一个组时,停止Pandas从groupby-apply旋转结果

时间:2017-10-16 23:58:25

标签: python pandas

我有一些代码首先根据某个标准选择数据,然后在groupand上执行 - 应用于Pandas数据帧。有时,数据只有1个符合条件的组。在这种情况下,Pandas将返回行向量而不是列向量。示例如下:

In [50]: x = pd.DataFrame([(round(i/2, 0), i, i) for i in range(0, 10)], column
    ...: s=['a', 'b', 'c'])

In [51]: x
Out[51]:
     a  b  c
0  0.0  0  0
1  0.0  1  1
2  1.0  2  2
3  2.0  3  3
4  2.0  4  4
5  2.0  5  5
6  3.0  6  6
7  4.0  7  7
8  4.0  8  8
9  4.0  9  9

In [52]: y = x.loc[x.a == 0.0].groupby('a').apply(lambda x: x.b / x.c)

In [53]: y
Out[53]:
      0    1
a
0.0 NaN  1.0
上例中的

是一个数据类型为pandas.DataFrame的行向量。如果.loc选择有两个或更多类,它将产生一个列向量。

In [54]: y = x.loc[x.a <= 1.0].groupby('a').apply(lambda x: x.b / x.c)

In [55]: y
Out[55]:
a
0.0  0    NaN
     1    1.0
1.0  2    1.0
dtype: float64

知道如何让这两种行为保持一致吗?最终,列向量就是我想要的。

由于

1 个答案:

答案 0 :(得分:0)

遗憾的是,一步到位都无法做到这一点。但是,您可以分两步执行此操作,方法是查询ngroups并相应地重新整理结果。

g = x.loc[...].groupby('a')
y = g.apply(lambda x: x.b / x.c)

if g.ngroups == 1:
    y = y.T