我有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]})
谢谢!
答案 0 :(得分:12)
使用Value
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
这将返回行的最小值(通过axis=1
时)
对于非异构dtypes和大型df,您可以使用df.min(axis=1)
,它会更快:
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时,这将成为一个重要因素
注意
对于0.24.0
版或更高版本,请使用numpy.min
因此上述内容变为:
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
与float 32
请参见该链接以获取进一步说明。熊猫在致电to_numpy