Pandas 选定行列的最小值

20 投票
2 回答
42698 浏览
提问于 2025-04-18 18:24

我正在尝试创建一个新列,这个列只包含每一行中几个列的最小值,比如:

    A0      A1      A2      B0      B1      B2      C0      C1
0   0.84    0.47    0.55    0.46    0.76    0.42    0.24    0.75
1   0.43    0.47    0.93    0.39    0.58    0.83    0.35    0.39
2   0.12    0.17    0.35    0.00    0.19    0.22    0.93    0.73
3   0.95    0.56    0.84    0.74    0.52    0.51    0.28    0.03
4   0.73    0.19    0.88    0.51    0.73    0.69    0.74    0.61
5   0.18    0.46    0.62    0.84    0.68    0.17    0.02    0.53
6   0.38    0.55    0.80    0.87    0.01    0.88    0.56    0.72

在这里,我想要创建一个列,这个列包含每一行中B0、B1和B2这几列的最小值。

输出结果应该是这样的:

    A0      A1      A2      B0      B1      B2      C0      C1      Minimum
0   0.84    0.47    0.55    0.46    0.76    0.42    0.24    0.75    0.42
1   0.43    0.47    0.93    0.39    0.58    0.83    0.35    0.39    0.39
2   0.12    0.17    0.35    0.00    0.19    0.22    0.93    0.73    0.00
3   0.95    0.56    0.84    0.74    0.52    0.51    0.28    0.03    0.51
4   0.73    0.19    0.88    0.51    0.73    0.69    0.74    0.61    0.51
5   0.18    0.46    0.62    0.84    0.68    0.17    0.02    0.53    0.17
6   0.38    0.55    0.80    0.87    0.01    0.88    0.56    0.72    0.01

这是代码的一部分,但它并没有按照我想要的方式工作:

for i in range(0,2):
    df['Minimum'] = df.loc[0,'B'+str(i)].min()

2 个回答

3

对于我的任务,一个通用且灵活的方法是下面这个例子:

df['Minimum'] = df[['B0', 'B1', 'B2']].apply(lambda x: min(x[0],x[1],x[2]), axis=1)

在这个例子中,目标列'Minimum'会根据选定的数据框(DF)中的列['B0', 'B1', 'B2']的结果来赋值。你可以通过函数的别名和新的索引来访问函数中的元素(如果元素数量超过一个)。一定要指定axis=1,这样就表示是逐行计算。这在需要进行复杂计算时非常方便。不过,我认为这种解决方案在速度上可能会稍微慢一些。

关于选择列,除了使用'for'方法,我还可以建议使用像这样的过滤器:

calls_to_use = list(filter(lambda f:'B' in f, df.columns))

实际上,过滤器是通过一个检查字母'B'出现与否的lambda函数应用于数据框列的列表。

之后,第一个例子可以写成如下:

calls_to_use = list(filter(lambda f:'B' in f, df.columns))    
df['Minimum'] = df[calls_to_use].apply(lambda x: min(x), axis=1)

不过在预先选择列之后,最好是:

df['Minimum'] = df[calls_to_use].min(axis=1)
32

这是一行代码,你只需要在min函数里用axis这个参数,告诉它要在列的方向上操作,而不是在行的方向上:

df['Minimum'] = df.loc[:, ['B0', 'B1', 'B2']].min(axis=1)

如果你需要对不同数量的列使用这个方法,可以用一个循环或者列表推导式来构建列的列表:

n_columns = 2
cols_to_use = ['B' + str(i) for i in range(n_columns)]
df['Minimum'] = df.loc[:, cols_to_use].min(axis=1)

撰写回答