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['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)
.values
和 to_numpy()
之间存在细微差异,这取决于您是否预先知道 dtype 不是混合的,并且可能的 dtype 是一个因素,例如float 16
vs float 32
请参阅 link 以获得进一步的解释。 Pandas 在调用 to_numpy
时会做更多的检查
我有 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['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)
.values
和 to_numpy()
之间存在细微差异,这取决于您是否预先知道 dtype 不是混合的,并且可能的 dtype 是一个因素,例如float 16
vs float 32
请参阅 link 以获得进一步的解释。 Pandas 在调用 to_numpy