我有一些代码首先根据某个标准选择数据,然后在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
知道如何让这两种行为保持一致吗?最终,列向量就是我想要的。
由于
答案 0 :(得分:0)
遗憾的是,一步到位都无法做到这一点。但是,您可以分两步执行此操作,方法是查询ngroups
并相应地重新整理结果。
g = x.loc[...].groupby('a')
y = g.apply(lambda x: x.b / x.c)
if g.ngroups == 1:
y = y.T