Pandas在原地映射列

19

我花了一些时间谷歌搜索并没有找到答案,我的问题很简单:如何在Pandas dataframe中就地映射列?比如说,我有以下的数据框:

In [67]: frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])

In [68]: frame
Out[68]: 
               b         d         e
Utah   -1.240032  1.586191 -1.272617
Ohio   -0.161516 -2.169133  0.223268
Texas  -1.921675  0.246167 -0.744242
Oregon  0.371843  2.346133  2.083234

我想把b列中的每个值都加1。我知道可以这样做:

In [69]: frame['b'] = frame['b'].map(lambda x: x + 1)

或者像这样 - 就我所知,在Series的上下文中,mapapply之间没有区别(除了map还可以接受dictSeries)- 如果我错了,请纠正我:

In [71]: frame['b'] = frame['b'].apply(lambda x: x + 1)

但是我不喜欢两次指定 'b'。相反,我想要做像这样的事情:

frame['b'].map(lambda x: x + 1, inplace=True)

可能吗?


2
如果你查看map - 不,这是不可能的。 - jezrael
2个回答

6
frame
Out[6]: 
               b         d         e
Utah   -0.764764  0.663018 -1.806592
Ohio    0.082226 -0.164653 -0.744252
Texas   0.763119  1.492637 -1.434447
Oregon -0.485245 -0.806335 -0.008397

frame['b'] +=1

frame
Out[8]: 
               b         d         e    
Utah    0.235236  0.663018 -1.806592
Ohio    1.082226 -0.164653 -0.744252
Texas   1.763119  1.492637 -1.434447
Oregon  0.514755 -0.806335 -0.008397

编辑以添加:

如果这是一个任意的函数,而且你确实需要进行就地应用,你可以编写一个轻量级的 pandas 包装器来处理它。个人认为,除非你写了大量代码,不想再写额外的字符,否则很难想象什么时候会那么关键而需要不使用标准实现。

from pandas import DataFrame
import numpy as np

class MyWrapper(DataFrame):
    def __init__(self, *args, **kwargs):
        super(MyWrapper,self).__init__(*args,**kwargs)

    def myapply(self,label, func):
        self[label]= super(MyWrapper,self).__getitem__(label).apply(func)


df =  frame = MyWrapper(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])
print df
df.myapply('b', lambda x: x+1)
print df

提供:

>>   
               b         d         e
Utah   -0.260549 -0.981025  1.136154
Ohio    0.073732 -0.895937 -0.025134
Texas   0.555507 -1.173679  0.946342
Oregon  1.871728 -0.850992  1.135784
               b         d         e
Utah    0.739451 -0.981025  1.136154
Ohio    1.073732 -0.895937 -0.025134
Texas   1.555507 -1.173679  0.946342
Oregon  2.871728 -0.850992  1.135784

显然,这只是一个非常简单的例子,希望为您展示一些有用的方法。

5
好的,+1只是一个例子。你要如何以这种方式编写任何自定义函数? - ars
啊,那个没有具体说明。人们通常使用apply将1添加到df中,这是令人惊讶的常见错误。我会进行修改。 - Chris
1
好的,现在我确定没有关于那个功能的库函数。 - ars

1
你可以使用 add
In [2]: import pandas as pd

In [3]: import numpy as np

In [4]: frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=
   ...: ['Utah', 'Ohio', 'Texas', 'Oregon'])

In [5]: frame.head()
Out[5]:
               b         d         e
Utah   -1.165332 -0.999244 -0.541742
Ohio   -0.319887  0.199094 -0.438669
Texas  -1.242524 -0.385092 -0.389616
Oregon  0.331593  0.505496  1.688962

In [6]: frame.b.add(1)
Out[6]:
Utah     -0.165332
Ohio      0.680113
Texas    -0.242524
Oregon    1.331593
Name: b, dtype: float64

In [7]:

10
如我在回复另一个答案时所述,+1 只是一个例子;我想要映射带有任意函数的列。 - ars

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接