【问题标题】:Modifying pandas dataframe in place using numpy ufuncs使用 numpy ufuncs 修改 pandas 数据框
【发布时间】:2017-01-27 22:39:28
【问题描述】:

我有四列的值:“A”、“B”、“C”和“D”,一列包含四个字母中的任何一个。

           Letter    A    B  C    D           max
12063289        D    5    9  0   39             0
12063290        D    3    25 0   79             0
12063291        B    0  232  0    0             0
12063292        A  351    0  0    0             0
12063293        D    0    0  0  394             0

根据字母列的值,我想计算其他三列的最大值。

           Letter    A    B  C    D           max
12063289        D    5    9  0   39             9
12063290        D    3    25 0   79             25
12063291        B    0  232  0   16             16
12063292        A  351    0  200  0             200
12063293        D    0    0  0  394             0

假设上面的数据存储在一个变量df中,我尝试了以下操作:

import numpy as np
import pandas as pd

columns = {'A':['B','C','D'], 
          'B':['A','C','D'],  
          'C':['A','B','D'],
          'D':['A','B','C']}
for letter in ['A', 'B', 'C', 'D']:
    mask = df.loc[df['Letter']==letter]
    np.max(df[mask][columns[letter]], out=df[mask]['max'])

我基本上希望 max 函数仅在屏蔽数据帧的相关列上工作,并在正确的位置写回原始数据帧 (df) 的“max”列,但 pandas 在最后一行抱怨:

ValueError: Must pass DataFrame with boolean values only

问题是我如何准确定位这些行的那些单元格以接收 max() 函数的输出,以便不使用不必要的空间(我可以使用 apply 函数来做到这一点,但它占用了大量空间我没有)。

【问题讨论】:

  • 那么,Letter 有每行最大 ID 的 ID?
  • Letter 具有与计算每个相应行中的最大值无关的列 ID。在第一行中,如果Letter 的值为“D”,则该列的最大值应根据“A”、“B”和“C”列计算。

标签: python pandas numpy numpy-ufunc


【解决方案1】:

apply

cols = list('ABCD')
df.apply(lambda x: x.loc[cols].drop(x.Letter).max(), 1)

12063289      9
12063290     25
12063291     16
12063292    200
12063293      0
dtype: int64

set_index + query + groupby

d1 = df.set_index(
    'Letter', append=True
)[list('ABCD')].rename_axis('Col', 1).stack().to_frame('value')
d1.query('Letter != Col').groupby(level=0).value.max()

12063289      9
12063290     25
12063291     16
12063292    200
12063293      0
dtype: int64

【讨论】:

  • 感谢您的回复,与我的幼稚解决方案相比,df.apply 解决方案将内存使用量减少了一半。但是它仍然使用大约 8 倍于原始数据帧的大小,如果我使用您提供的两个解决方案中的第一个,有没有办法通过 np.max 的 out= 参数进行改进?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2020-06-02
相关资源
最近更新 更多