使用pandas查找两个或更多列的最大值

时间:2012-08-28 23:58:47

标签: python dataframe pandas

我有一个包含A列,B的数据框。我需要为每个记录/行创建一个列C

C = max(A, B)

我该怎么做呢?

感谢。

3 个答案:

答案 0 :(得分:97)

你可以得到这样的最大值:

>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [-2, 8, 1]})
>>> df
   A  B
0  1 -2
1  2  8
2  3  1
>>> df[["A", "B"]]
   A  B
0  1 -2
1  2  8
2  3  1
>>> df[["A", "B"]].max(axis=1)
0    1
1    8
2    3

所以:

>>> df["C"] = df[["A", "B"]].max(axis=1)
>>> df
   A  B  C
0  1 -2  1
1  2  8  8
2  3  1  3

如果您知道“A”和“B”是唯一的列,您甚至可以使用

>>> df["C"] = df.max(axis=1)

我猜你也可以使用.apply(max, axis=1)

答案 1 :(得分:5)

@DSM在几乎所有正常情况下的答案都很好。但是,如果您是想比表面层次更深入的程序员,那么您可能会想知道,在基础.values数组上调用numpy函数比直接调用要快一些在DataFrame / Series对象上定义的(cythonized)函数。

例如,您可以沿第一个轴使用ndarray.max

# Data borrowed from @DSM's post.
df = pd.DataFrame({"A": [1,2,3], "B": [-2, 8, 1]})
df
   A  B
0  1 -2
1  2  8
2  3  1

df['C'] = df[['A', 'B']].values.max(1)
# Or, assuming "A" and "B" are the only columns, 
# df['C'] = df.values.max(1) 
df

   A  B  C
0  1 -2  1
1  2  8  8
2  3  1  3 

请注意,如果您的数据有NaN,则需要np.nanmax

df['C'] = np.nanmax(df.values, axis=1)
df

   A  B  C
0  1 -2  1
1  2  8  8
2  3  1  3 

您也可以使用numpy.maximum.reducenp.maximumufunc (Universal Function),而every ufunc has a 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

   A  B  C
0  1 -2  1
1  2  8  8
2  3  1  3

性能

使用perfplot模块进行测量。生成的图显示相对性能; Y轴是对数的。

import pandas as pd
import perfplot

np.random.seed(0)
df_ = pd.DataFrame(np.random.randn(5, 1000))

perfplot.show(
    setup=lambda n: pd.concat([df_] * n, ignore_index=True),
    kernels=[
        lambda df: df.assign(new=df.max(axis=1)),
        lambda df: df.assign(new=df.values.max(1)),
        lambda df: df.assign(new=np.nanmax(df.values, axis=1)),
        lambda df: df.assign(new=np.maximum.reduce(df.values, axis=1)),
    ],
    labels=['df.max', 'np.max', 'np.maximum.reduce', 'np.nanmax'],
    n_range=[2**k for k in range(0, 12)],
    xlabel='N (* len(df))',
    logy=True
)

enter image description here

np.maximum.reducenp.max看起来或多或少是相同的(对于大多数正常大小的DataFrame),并且阴影的速度比DataFrame.max快。我认为这种差异大致保持不变,这是由于内部开销(索引对齐,处理NaN等)造成的。

答案 2 :(得分:0)

在多个列中找到最大值将是:

df[['A','B']].max(axis=1).max(axis=0)

示例:

df = 

                         A      B
timestamp                                
2019-11-20 07:00:16  14.037880  15.217879
2019-11-20 07:01:03  14.515359  15.878632
2019-11-20 07:01:33  15.056502  16.309152
2019-11-20 07:02:03  15.533981  16.740607
2019-11-20 07:02:34  17.221073  17.195145

print(df[['A','B']].max(axis=1).max(axis=0))
17.221073