使用pandas.Series.apply时自定义函数中的参数

时间:2017-05-26 08:21:28

标签: python pandas

这是一个简单的pandas Dataframe,定义如下:

df = pd.DataFrame( {
    'word':     ['flower', 'mountain', 'ocean', 'universe'],
    'k':        [1, 2, 3, 4]
} )

>>> df
   k      word
0  1    flower
1  2  mountain
2  3     ocean
3  4  universe

我想将df更改为此(用前k个字母替换每个单词)

>>> df
   k  word
0  1     f
1  2    mo
2  3   oce
3  4  univ

我有一个想法,通过使用pandas.Series.apply和自定义函数

来实现这一点
def get_first_k_letters( x, k ):
    return x[:k]

df['word'] = df['word'].apply( get_first_k_letters, args=(3,) )

>>> df
   k word
0  1  flo
1  2  mou
2  3  oce
3  4  uni

我可以通过设置args =(3,)来轻松地用前3个字母替换每个单词。

但是我想用前k个字母替换每个单词(k并不总是相同的),在这种情况下我不知道args的设置是什么。

有人能帮帮我吗?谢谢! (不使用pandas.Series.apply的其他方法也可以!)

2 个答案:

答案 0 :(得分:2)

你可以这样做:

df.apply(lambda x: get_first_k_letters(x['word'], x['k']), axis=1)

使用apply选项执行axis=1,将每一行都生成xlambda。给予axis=0给出列,而不是行。为您的函数提供x['word']x['k']会产生正确的结果:

0       f
1      mo
2     oce
3    univ
dtype: object

答案 1 :(得分:2)

我考虑这种方法:

In [121]: df['word'] = [w[1][:w[0]] for w in df.values]

In [122]: df
Out[122]:
   k  word
0  1     f
1  2    mo
2  3   oce
3  4  univ

时间:为40.000行DF:

In [123]: df = pd.concat([df] * 10**4, ignore_index=True)

In [124]: df.shape
Out[124]: (40000, 2)

In [125]: %timeit df.apply(lambda x: get_first_k_letters(x['word'], x['k']), axis=1)
1 loop, best of 3: 4.04 s per loop

In [126]: %timeit [w[1][:w[0]] for w in df.values]
10 loops, best of 3: 52.5 ms per loop

In [127]: 4.04 * 1000 / 52.5
Out[127]: 76.95238095238095