A. *_*tin 5 python indexing dataframe pandas
我想知道是否有更有效的方法来执行在Excel中流行的“索引和匹配”类型的函数。例如,给定两个熊猫DataFrame,用在df_2中找到的信息更新df_1:
import pandas as pd
df_1 = pd.DataFrame({'num_a':[1, 2, 3, 4, 5],
'num_b':[2, 4, 1, 2, 3]})
df_2 = pd.DataFrame({'num':[1, 2, 3, 4, 5],
'name':['a', 'b', 'c', 'd', 'e']})
Run Code Online (Sandbox Code Playgroud)
我正在使用在df_1和df_2中都具有约80,000行的数据集,我的目标是在df_1中创建两个新列,即“ name_a”和“ name_b”。
下面是我能想到的最有效的方法。有有是一个更好的办法!
name_a = []
name_b = []
for i in range(len(df_1)):
name_a.append(df_2.name.iloc[df_2[
df_2.num == df_1.num_a.iloc[i]].index[0]])
name_b.append(df_2.name.iloc[df_2[
df_2.num == df_1.num_b.iloc[i]].index[0]])
df_1['name_a'] = name_a
df_1['name_b'] = name_b
Run Code Online (Sandbox Code Playgroud)
导致:
>>> df_1.head()
num_a num_b name_a name_b
0 1 2 a b
1 2 4 b d
2 3 1 c a
3 4 2 d b
4 5 3 e c
Run Code Online (Sandbox Code Playgroud)
高水平
replacereplace,rename列和joinm = dict(zip(
df_2.num.values.tolist(),
df_2.name.values.tolist()
))
df_1.join(
df_1.replace(m).rename(
columns=lambda x: x.replace('num', 'name')
)
)
num_a num_b name_a name_b
0 1 2 a b
1 2 4 b d
2 3 1 c a
3 4 2 d b
4 5 3 5 c
Run Code Online (Sandbox Code Playgroud)
分解
replace用字典应该很快。建立字典形式有很多方法df_2。实际上,我们可以使用pd.Series。我选择使用dict和进行构建,zip因为我发现它更快。
建造 m
选项1
m = df_2.set_index('num').name
Run Code Online (Sandbox Code Playgroud)
选项2
m = df_2.set_index('num').name.to_dict()
Run Code Online (Sandbox Code Playgroud)
选项3
m = dict(zip(df_2.num, df_2.name))
Run Code Online (Sandbox Code Playgroud)
选项4(我的选择)
m = dict(zip(df_2.num.values.tolist(), df_2.name.values.tolist()))
Run Code Online (Sandbox Code Playgroud)
m 建造时间
1000 loops, best of 3: 325 µs per loop
1000 loops, best of 3: 376 µs per loop
10000 loops, best of 3: 32.9 µs per loop
100000 loops, best of 3: 10.4 µs per loop
%timeit df_2.set_index('num').name
%timeit df_2.set_index('num').name.to_dict()
%timeit dict(zip(df_2.num, df_2.name))
%timeit dict(zip(df_2.num.values.tolist(), df_2.name.values.tolist()))
Run Code Online (Sandbox Code Playgroud)
更换 num
同样,我们有选择,这里是一些时间。
%timeit df_1.replace(m)
%timeit df_1.applymap(lambda x: m.get(x, x))
%timeit df_1.stack().map(lambda x: m.get(x, x)).unstack()
1000 loops, best of 3: 792 µs per loop
1000 loops, best of 3: 959 µs per loop
1000 loops, best of 3: 925 µs per loop
Run Code Online (Sandbox Code Playgroud)
我选择...
df_1.replace(m)
num_a num_b
0 a b
1 b d
2 c a
3 d b
4 5 c
Run Code Online (Sandbox Code Playgroud)
重命名列
df_1.replace(m).rename(columns=lambda x: x.replace('num', 'name'))
name_a name_b <-- note the column name change
0 a b
1 b d
2 c a
3 d b
4 5 c
Run Code Online (Sandbox Code Playgroud)
加入
df_1.join(df_1.replace(m).rename(columns=lambda x: x.replace('num', 'name')))
num_a num_b name_a name_b
0 1 2 a b
1 2 4 b d
2 3 1 c a
3 4 2 d b
4 5 3 5 c
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8597 次 |
| 最近记录: |