prp*_*prp 10 python python-3.x pandas
我想将“UserId”中的最后一位数字存储在一个新变量中(此类 UserId 是字符串类型)。
我想出了这个,但这是一个很长的 df 并且需要永远。关于如何优化/避免 for 循环的任何提示?
df['LastDigit'] = np.nan
for i in range(0,len(df['UserId'])):
df.loc[i]['LastDigit'] = df.loc[i]['UserId'].strip()[-1]
Run Code Online (Sandbox Code Playgroud)
jez*_*ael 15
使用str.strip与索引的str[-1]:
df['LastDigit'] = df['UserId'].str.strip().str[-1]
Run Code Online (Sandbox Code Playgroud)
如果性能很重要并且没有缺失值,请使用列表理解:
df['LastDigit'] = [x.strip()[-1] for x in df['UserId']]
Run Code Online (Sandbox Code Playgroud)
您的解决方案是很慢,这是从去年解决此:
6) 更新一个空帧(例如使用 loc 一次一行)
性能:
np.random.seed(456)
users = ['joe','jan ','ben','rick ','clare','mary','tom']
df = pd.DataFrame({
'UserId': np.random.choice(users, size=1000),
})
In [139]: %%timeit
...: df['LastDigit'] = np.nan
...: for i in range(0,len(df['UserId'])):
...: df.loc[i]['LastDigit'] = df.loc[i]['UserId'].strip()[-1]
...:
__main__:3: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
57.9 s ± 1.48 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [140]: %timeit df['LastDigit'] = df['UserId'].str.strip().str[-1]
1.38 ms ± 150 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [141]: %timeit df['LastDigit'] = [x.strip()[-1] for x in df['UserId']]
343 µs ± 8.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19691 次 |
| 最近记录: |