选定行和列的Pandas min()函数

20

我正在尝试创建一个只包含一行和几列的最小值的列,例如:

    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个回答

32

这是一个一行的代码,您只需要使用 minaxis 参数,告诉它在列之间而不是在行之间工作:

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

如果需要将此解决方案用于不同数量的列,则可以使用for循环或列表推导式构造列的列表:

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)

谢谢。但是如果对于不同的情况,列数发生变化怎么办?这就是我使用for循环的原因,实际上,我在范围内传递了一个变量,像这样: for i in range(0,total): 我尝试了你建议的方法,但是它给我返回了所有的零。 - yash.trojan.25
我尝试使用for循环,但它返回行/列中的最后一个元素,而不是最小值。 - yash.trojan.25
@yash.trojan.25 我用你的DataFrame示例尝试了一下...它成功了! - Andy Hayden
@yash.trojan.25:请查看我的编辑,了解如何在列数不确定的情况下使用此代码。我不确定您如何得到“全是零”,但我已经测试过这个解决方案,并获得了您预期的输出结果。 - Marius
太棒了!完美地运行了!正是我想要的。谢谢。 - yash.trojan.25
@Marius,你能解释一下这里的:切片是如何工作的吗?它允许使用键,否则键将无法在索引中找到。如果有文档指针,将不胜感激。 - noblerthanoedipus

3

对于我的任务来说,一个通用且灵活的方法是以下示例:

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

目标列“最小值”基于选定的DF列['B0'、 'B1'、 'B2']分配lambda函数的结果。通过函数别名和它的新索引(如果元素数量大于一个)来访问函数中的元素。一定要指定axis=1,表示逐行计算。当需要进行复杂计算时,这非常方便。但是,我认为这种解决方案在速度上可能不如其他方法。
至于列的选择,除了“for”方法之外,我建议使用类似于以下的过滤器:
calls_to_use = list(filter(lambda f:'B' in f, df.columns))

简单来说,通过一个lambda函数对DF列的列表进行过滤,并检查字母'B'的出现情况。

之后,第一个示例可按以下方式编写:

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)

3
虽然这段代码可能解决了问题,但是包括一些解释会有助于提高您的发帖质量并使其更易理解。请记住,您回答的问题是为了将来的读者,这些人可能不知道您提供代码建议的原因。 - 4b0

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