亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用熊貓查找最多兩列或更多列

使用熊貓查找最多兩列或更多列

慕無忌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生成的?;鶞蕼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, 15)],

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

    logx=True,

    logy=True)


查看完整回答
反對 回復 2019-10-29
  • 2 回答
  • 0 關注
  • 496 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號