选定行和列的 Pandas min()
Posted
技术标签:
【中文标题】选定行和列的 Pandas min()【英文标题】:Pandas min() of selected row and columns 【发布时间】:2014-10-18 05:33: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()
【问题讨论】:
【参考方案1】:这是一个单行,您只需要使用 axis
的参数 min
告诉它跨列而不是向下工作:
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): I try what you建议,但它给了我所有的零。 我用for循环试过了,但它返回行/列的最后一个元素,而不是最小值。 @yash.***.25 我用你的示例 DataFrame 进行了尝试......它成功了! @yash.***.25:请参阅我的编辑以了解如何将其与可变数量的列一起使用。我不确定你是如何得到“全零”的,但我确实用你的示例数据测试了这个解决方案并得到了你的预期输出。 太棒了!效果很好!正是我想要的。谢谢。【参考方案2】:对于我的任务,一个通用且灵活的方法是以下示例:
df['Minimum'] = df[['B0', 'B1', 'B2']].apply(lambda x: min(x[0],x[1],x[2]), axis=1)
目标列“Minimum”根据选定的 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)
【讨论】:
虽然这段代码可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。以上是关于选定行和列的 Pandas min()的主要内容,如果未能解决你的问题,请参考以下文章
在 pandas 中,如何在具有匹配行和列的 3 个单独数据帧之间建立相关矩阵?