为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕无忌1623718 2019-10-29 14:03:41
我有一个列的数据帧A,B。我需要创建一个列C,以便为每个记录/行:C = max(A, B)。我应该怎么做呢?谢谢。
查看完整描述

2 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

您可以这样获得最大值:


>>> 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)我猜你也可以使用。


查看完整回答
反对 回复 2019-10-29
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

在几乎所有正常情况下,@ 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

   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,则将需要numpy.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.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


   A  B  C

0  1 -2  1

1  2  8  8

2  3  1  3

在此处输入图片说明


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


该图是使用perfplot生成的。基准测试代码,以供参考:


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, 15)],

    xlabel='N (* len(df))',

    logx=True,

    logy=True)


查看完整回答
反对 回复 2019-10-29
  • 2 回答
  • 0 关注
  • 469 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信