使用熊猫查找最多两列或更多列

我有一个列的数据帧A,B。我需要创建一个列C,以便为每个记录/行:


C = max(A, B)。


我应该怎么做呢?


谢谢。


慕无忌1623718
浏览 470回答 2
2回答

白猪掌柜的

您可以这样获得最大值:>>> import pandas as pd>>> df = pd.DataFrame({"A": [1,2,3], "B": [-2, 8, 1]})>>> df   A  B0  1 -21  2  82  3  1>>> df[["A", "B"]]   A  B0  1 -21  2  82  3  1>>> df[["A", "B"]].max(axis=1)0    11    82    3所以:>>> df["C"] = df[["A", "B"]].max(axis=1)>>> df   A  B  C0  1 -2  11  2  8  82  3  1  3如果您知道“ A”和“ B”是唯一的列,那么您甚至可以逃脱>>> df["C"] = df.max(axis=1).apply(max, axis=1)我猜你也可以使用。

斯蒂芬大帝

在几乎所有正常情况下,@ DSM的答案都很好。但是,如果您是想比表面层次更深入的程序员,那么您可能会想知道,在基础.to_numpy()(或.values对于<0.24)数组上调用numpy函数要比直接调用更快一些。调用在DataFrame / Series对象上定义的(cythonized)函数。例如,您可以ndarray.max()沿第一个轴使用。# Data borrowed from @DSM's post.df = pd.DataFrame({"A": [1,2,3], "B": [-2, 8, 1]})df&nbsp; &nbsp;A&nbsp; B0&nbsp; 1 -21&nbsp; 2&nbsp; 82&nbsp; 3&nbsp; 1df['C'] = df[['A', 'B']].values.max(1)# Or, assuming "A" and "B" are the only columns,&nbsp;# df['C'] = df.values.max(1)&nbsp;df&nbsp; &nbsp;A&nbsp; B&nbsp; C0&nbsp; 1 -2&nbsp; 11&nbsp; 2&nbsp; 8&nbsp; 82&nbsp; 3&nbsp; 1&nbsp; 3&nbsp;如果您的数据包含NaN,则将需要numpy.nanmax:df['C'] = np.nanmax(df.values, axis=1)df&nbsp; &nbsp;A&nbsp; B&nbsp; C0&nbsp; 1 -2&nbsp; 11&nbsp; 2&nbsp; 8&nbsp; 82&nbsp; 3&nbsp; 1&nbsp; 3&nbsp;您也可以使用numpy.maximum.reduce。numpy.maximum是一个ufunc(通用函数),每个ufunc都有一个reduce:df['C'] = np.maximum.reduce(df['A', 'B']].values, axis=1)# df['C'] = np.maximum.reduce(df[['A', 'B']], axis=1)# df['C'] = np.maximum.reduce(df, axis=1)df&nbsp; &nbsp;A&nbsp; B&nbsp; C0&nbsp; 1 -2&nbsp; 11&nbsp; 2&nbsp; 8&nbsp; 82&nbsp; 3&nbsp; 1&nbsp; 3在此处输入图片说明np.maximum.reduce并且np.max看起来大致相同(对于大多数正常大小的DataFrame),并且阴影的速度比快DataFrame.max。我认为这种差异大致保持不变,并且是由于内部开销(索引对齐,处理NaN等)引起的。该图是使用perfplot生成的。基准测试代码,以供参考:import pandas as pdimport perfplotnp.random.seed(0)df_ = pd.DataFrame(np.random.randn(5, 1000))perfplot.show(&nbsp; &nbsp; setup=lambda n: pd.concat([df_] * n, ignore_index=True),&nbsp; &nbsp; kernels=[&nbsp; &nbsp; &nbsp; &nbsp; lambda df: df.assign(new=df.max(axis=1)),&nbsp; &nbsp; &nbsp; &nbsp; lambda df: df.assign(new=df.values.max(1)),&nbsp; &nbsp; &nbsp; &nbsp; lambda df: df.assign(new=np.nanmax(df.values, axis=1)),&nbsp; &nbsp; &nbsp; &nbsp; lambda df: df.assign(new=np.maximum.reduce(df.values, axis=1)),&nbsp; &nbsp; ],&nbsp; &nbsp; labels=['df.max', 'np.max', 'np.maximum.reduce', 'np.nanmax'],&nbsp; &nbsp; n_range=[2**k for k in range(0, 15)],&nbsp; &nbsp; xlabel='N (* len(df))',&nbsp; &nbsp; logx=True,&nbsp; &nbsp; logy=True)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python