这是一个简单的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的其他方法也可以!)
答案 0 :(得分:2)
你可以这样做:
df.apply(lambda x: get_first_k_letters(x['word'], x['k']), axis=1)
使用apply
选项执行axis=1
,将每一行都生成x
(lambda
。给予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