假设我已经2个的数据帧,df_a
并df_b
如下:
import pandas as pd
df_a
df_a = pd.DataFrame({"Letters": ['E', 'H', 'O', 'N', 'M', 'K', 'T', 'X'],
"Greek":['epsilon', 'eta', 'omicron', 'nu', 'mu',
'kappa', 'tau', 'chi']})
Greek Letters
0 epsilon E
1 eta H
2 omicron O
3 nu N
4 mu M
5 kappa K
6 tau T
7 chi X
df_b
df_b = pd.DataFrame({"Letters": ['Y', 'E', 'N', 'X', 'B']})
df_b["Greek"] = ""
Letters Greek
0 Y
1 E
2 N
3 X
4 B
我想df_b
使用中的相应值来填充“希腊语”列,df_a
并且可以使用嵌套循环来做到这一点,如下所示:
for i, row in df_a.iterrows():
temp1 = row['Letters']
for k, row in df_b.iterrows():
temp2 = row['Letters']
if temp1 == temp2:
df_b.loc[k, "Greek"]=df_a.loc[i, "Greek"]
df_b
Letters Greek
0 Y
1 E epsilon
2 N nu
3 X chi
4 B
首先,我想知道如果我可以用更有效地达到同样的效果merge
,zip
,join
或其他的级联功能。其次,如果我提供与else
该if
语句的匹配项,则如下:
else: df_b.loc[k, "Greek"] = float('nan')
我希望这将用填充空白单元格,NaN
而不修改其他单元格。相反,我得到类似的东西:
df_b
Letters Greek
0 Y NaN
1 E NaN
2 N NaN
3 X chi
4 B NaN
感谢您对这两点的想法。欢迎任何其他反馈。
最快的方法是将“ Letters”设置为df_a的索引,然后调用map
:
In [11]:
df_a = df_a.set_index('Letters')
df_b['Greek'] = df_b['Letters'].map(df_a['Greek'])
df_b
Out[11]:
Letters Greek
0 Y NaN
1 E epsilon
2 N nu
3 X chi
4 B NaN
只是为了证明循环中的缺陷,值得打印出发生的情况:
In [17]:
for i, row in df_a.iterrows():
temp1 = row['Letters']
for k, row in df_b.iterrows():
temp2 = row['Letters']
if temp1 == temp2:
print("match i:", i, "k:", k, "letter:", temp2)
else:
print("no match i:", i, "k:", k, "letter:", temp2)
no match i: 0 k: 0 letter: Y
match i: 0 k: 1 letter: E
no match i: 0 k: 2 letter: N
no match i: 0 k: 3 letter: X
no match i: 0 k: 4 letter: B
no match i: 1 k: 0 letter: Y
no match i: 1 k: 1 letter: E
no match i: 1 k: 2 letter: N
no match i: 1 k: 3 letter: X
no match i: 1 k: 4 letter: B
no match i: 2 k: 0 letter: Y
no match i: 2 k: 1 letter: E
no match i: 2 k: 2 letter: N
no match i: 2 k: 3 letter: X
no match i: 2 k: 4 letter: B
no match i: 3 k: 0 letter: Y
no match i: 3 k: 1 letter: E
match i: 3 k: 2 letter: N
no match i: 3 k: 3 letter: X
no match i: 3 k: 4 letter: B
no match i: 4 k: 0 letter: Y
no match i: 4 k: 1 letter: E
no match i: 4 k: 2 letter: N
no match i: 4 k: 3 letter: X
no match i: 4 k: 4 letter: B
no match i: 5 k: 0 letter: Y
no match i: 5 k: 1 letter: E
no match i: 5 k: 2 letter: N
no match i: 5 k: 3 letter: X
no match i: 5 k: 4 letter: B
no match i: 6 k: 0 letter: Y
no match i: 6 k: 1 letter: E
no match i: 6 k: 2 letter: N
no match i: 6 k: 3 letter: X
no match i: 6 k: 4 letter: B
no match i: 7 k: 0 letter: Y
no match i: 7 k: 1 letter: E
no match i: 7 k: 2 letter: N
match i: 7 k: 3 letter: X
no match i: 7 k: 4 letter: B
因此,尽管您进行了初始匹配,但还是再次循环遍历了这些行,并通过闪动NaN
而不是跳过它们。
时机
In [22]:
df_a = df_a.set_index('Letters')
%timeit df_b['Greek'] = df_b['Letters'].map(df_a['Greek'])
1000 loops, best of 3: 710 µs per loop
In [24]:
%%timeit
for i, row in df_a.iterrows():
temp1 = row['Letters']
for k, row in df_b.iterrows():
temp2 = row['Letters']
if temp1 == temp2:
df_b.loc[k, "Greek"]=df_a.loc[i, "Greek"]
100 loops, best of 3: 12.7 ms per loop
此处调用map的速度快了将近18倍,这是矢量化函数,并且可扩展性更好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句