如何在DataFrame中按axis=1分组

8

我有:

df = pd.DataFrame({'A':[1, 2, -3],'B':[1,2,6]})
df
    A   B
0   1   1
1   2   2
2   -3  6

问:如何获得:

    A
0   1
1   2
2   1.5

使用groupby()aggregate()函数?

类似于这样:

df.groupby([0,1], axis=1).aggregate('mean')

所以基本上是沿着 axis=1 进行分组,并使用行索引 01 进行分组。(不使用转置)


1
你是否在寻找只有 df.apply(pd.Series.mean, 1) 的代码?你也可以通过 df.apply(pd.Series.mean, 1).to_frame('A') 将其转换为数据框。 - Abdou
4个回答

3

你正在寻找什么?

df.mean(1)
Out[71]: 
0    1.0
1    2.0
2    1.5
dtype: float64

如果您确实需要使用 groupby
df.groupby(['key']*df.shape[1],axis=1).mean()
Out[72]: 
   key
0  1.0
1  2.0
2  1.5

1
但是我想能够将行索引指定为groupby的第一个参数(类似于在axis = 0时使用列索引作为第一个参数进行groupby)。你明白我的意思吗? - Ankur Agarwal

3

分组键可以有四种形式,我只提到与您的问题相关的第一种和第三种。以下内容摘自《使用Pandas进行数据分析》:

每个分组键都可以采用多种形式,并且键不必全部是相同类型的:

• 与正在分组的轴长度相同的值列表或数组

• 给出正在分组的轴上的值与组名之间对应关系的dict或Series

因此,您可以传递与您的列轴、分组轴长度相同的数组,或者像下面的字典:

df1.groupby({x:'mean' for x in df1.columns}, axis=1).mean()

    mean
0   1.0
1   2.0
2   1.5

可以使用df1.groupby([1,1], axis=1).mean()df1.groupby(['SS','SS'], axis=1).mean()来减少代码行数,但是@iDrwish的代码更易读,因为字典清楚地显示了映射关系。 - sakeesh

3

假设原始数据框为以下情况 -

   A  B  C
0  1  1  2
1  2  2  3
2 -3  6  1

请使用命令:df.groupby(by=lambda x : df[x].loc[0],axis=1).mean(),以获得所需的输出结果 -
     1    2
0  1.0  2.0
1  2.0  3.0
2  1.5  1.0

在这里,函数lambda x : df[x].loc[0]被用来将列AB映射到1,将列C映射到2。这个映射随后被用来决定分组。
你也可以使用任何在groupby语句之外定义的复杂函数来代替lambda函数。

-1

试试这个:

df["A"] = np.mean(dff.loc[:,["A","B"]],axis=1)
df.drop(columns=["B"],inplace=True)
      A
 0   1.0
 1   2.0
 2   1.5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接