Pandas:获取 2 个数据框列之间的最小值

Pandas: get the min value between 2 dataframe columns

我有 2 列,我希望第 3 列是它们之间的最小值。 我的数据如下所示:

   A  B
0  2  1
1  2  1
2  2  4
3  2  4
4  3  5
5  3  5
6  3  6
7  3  6

我想通过以下方式获取 C 列:

   A  B   C
0  2  1   1
1  2  1   1
2  2  4   2
3  2  4   2
4  3  5   3
5  3  5   3
6  3  6   3
7  3  6   3

一些帮助代码:

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

谢谢!

使用df.min(axis=1)

df['c'] = df.min(axis=1)
df
Out[41]: 
   A  B  c
0  2  1  1
1  2  1  1
2  2  4  2
3  2  4  2
4  3  5  3
5  3  5  3
6  3  6  3
7  3  6  3

这 returns 最小行(通过时 axis=1

对于非异构数据类型和大型 dfs,您可以使用 numpy.min,这样会更快:

In[42]:
df['c'] = np.min(df.values,axis=1)
df

Out[42]: 
   A  B  c
0  2  1  1
1  2  1  1
2  2  4  2
3  2  4  2
4  3  5  3
5  3  5  3
6  3  6  3
7  3  6  3

计时:

In[45]:
df = pd.DataFrame({'A': [2, 2, 2, 2, 3, 3, 3, 3],
                   'B': [1, 1, 4, 4, 5, 5, 6, 6]})
df = pd.concat([df]*1000, ignore_index=True)
df.shape

Out[45]: (8000, 2)

所以对于 8K 行 df:

%timeit df.min(axis=1)
%timeit np.min(df.values,axis=1)
314 µs ± 3.63 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
34.4 µs ± 161 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

你可以看到 numpy 版本快了近 10 倍(注意我传递了 df.values 所以我们传递了一个 numpy 数组),当我们得到更大的 dfs[=30 时,这将成为一个更重要的因素=]

备注

对于 0.24.0 或更高版本,使用 to_numpy()

所以上面变成:

df['c'] = np.min(df.to_numpy(),axis=1)

时间:

%timeit df.min(axis=1)
%timeit np.min(df.values,axis=1)
%timeit np.min(df.to_numpy(),axis=1)
314 µs ± 3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
35.2 µs ± 680 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
35.5 µs ± 262 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

.valuesto_numpy() 之间存在细微差异,这取决于您是否预先知道 dtype 不是混合的,并且可能的 dtype 是一个因素,例如float 16 vs float 32 请参阅 link 以获得进一步的解释。 Pandas 在调用 to_numpy

时会做更多的检查