有一個包含last_elementand的 DataFrame root。
import pandas as pd
df_test = pd.DataFrame({"last_element":["2000A01.2 B003", "8000N02 B001"]*100000, "root":[None, "8000N02"]*100000})
df_test.head()
---- ---------------- ---------
| | last_element | root |
|---- ---------------- ---------|
| 0 | 2000A01.2 B003 | |
| 1 | 8000N02 B001 | 8000N02 |
| 2 | 2000A01.2 B003 | |
| 3 | 8000N02 B001 | 8000N02 |
| 4 | 2000A01.2 B003 | |
---- ---------------- ---------
如果root為空,我們可以從last_element. 空格前的值始終是root。
我已經有了解決方案,但想問是否有人有更快的解決方案,因為在實際資料上計算需要一分鐘以上。
解決方案 1 - 功能
%%timeit
df_test = pd.DataFrame({"last_element":["2000A01.2 B003", "8000N02 B001"]*100000, "root":[None, "8000N02"]*100000})
def fill_root(row):
if pd.isna(row.root) & pd.notna(row.last_element):
return row.last_element.split(' ')[0]
else:
return row.root
df_test.assign(new_root = lambda x: x.apply(fill_root, axis=1))
時間:
5.14 s ± 41.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
解決方案 2 - 應用
%%timeit
df_test['new_root'] = df_test.apply(lambda row: row.last_element.split(' ')[0] if pd.isna(row.root) else row.root, axis=1)
時間:
3.67 s ± 21.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
uj5u.com熱心網友回復:
你可以試試np.where
df['new'] = np.where(df['root'].isna(),df['last_element'].str.split().str[0],df['root'])
或者
df['root'].mask(df['root'].isna(),df['last_element'].str.split().str[0],inplace=True)
定時
#%timeit df_test['new_root'] = df_test.apply(lambda row: row.last_element.split(' ')[0] if pd.isna(row.root) else row.root, axis=1)
2.97 s ± 101 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
#%timeit df['new_root'] = df['root'].mask(df['root'].isna(),df['last_element'].str.split().str[0])
170 ms ± 348 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
#%timeit df['new_root'] = np.where(df['root'].isna(),df['last_element'].str.split().str[0],df['root'])
172 ms ± 2.75 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
uj5u.com熱心網友回復:
你可以使用面具和df.loc
mask = df_test['root'].isnull()
df_test.loc[mask,'root'] = df_test.loc[mask, 'last_element'].str.split(' ').str[0]
# timeit
def function(df_test):
mask = df_test['root'].isnull()
df_test.loc[mask,'root'] = df_test.loc[mask, 'last_element'].str.split(' ').str[0]
%timeit function(df_test)
11.6 ms ± 494 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/511899.html
標籤:Python熊猫麻木的
下一篇:如何排除日期型別列
