使用来自另一个数据框的值修改数据框

塞德

假设我已经2个的数据帧,df_adf_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     

首先,我想知道如果我可以用更有效地达到同样的效果mergezipjoin或其他的级联功能。其次,如果我提供与elseif语句的匹配项,则如下:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用来自另一个数据框的数据按组替换数据框值

来自分类Dev

使用来自另一个数据框的名称重命名列

来自分类Dev

使用来自另一个数据框的名称重命名列

来自分类Dev

使用来自另一个数据框的值更新数据框标头

来自分类Dev

使用来自另一个数据框的索引替换数据框中的行

来自分类Dev

如何使用来自另一个数据框的随机值更新Pyspark中的数据框?

来自分类Dev

R:使用来自另一个数据框的映射在一个数据框中创建一个新列

来自分类Dev

使用来自另一个数据框的值作为R中的变量名称来对数据框进行变异

来自分类Dev

使用来自另一个数据框的值创建新的dask数据框列会导致“块大小未知”错误

来自分类Dev

通过比较列,用来自另一个数据框列的值填充 NaN

来自分类Dev

根据来自另一个数据框的值创建新的数据框

来自分类Dev

根据来自另一个数据框的值将数据框拆分为多个数据框

来自分类Dev

大熊猫:使用来自另一个数据框的重复行更新多个数据框列

来自分类Dev

根据来自另一个的组值填充一个数据框

来自分类Dev

如何基于另一个数据框更改数据框的元素?

来自分类Dev

使用pd.merge映射一个数据框中来自另一个数据框的多个列的值

来自分类Dev

使用另一个数据框的唯一值创建并填充一个数据框

来自分类Dev

根据来自另一个数据框的值查找数据框值的平均值

来自分类Dev

基于&运算的子集pandas数据框来自另一个数据框的列

来自分类Dev

R:创建新的数据框行是来自另一个数据框的列

来自分类Dev

使用另一个在一个数据框中搜索值

来自分类Dev

如何向一个数据框添加与来自另一个数据框的矢量的相等值相对应的值

来自分类Dev

用另一个数据框的值替换一个数据框的列值

来自分类Dev

根据另一个数据框的值填充一个数据框的值

来自分类Dev

熊猫用另一个数据框的值替换一个数据框的值

来自分类Dev

根据dplyr与另一个数据框的匹配来更改数据框中的列名称

来自分类Dev

如何访问另一个数据框中的列表/数据框值

来自分类Dev

保留另一个数据框中包含的数据框的值

来自分类Dev

遍历数据框并替换为另一个数据框的值

Related 相关文章

  1. 1

    使用来自另一个数据框的数据按组替换数据框值

  2. 2

    使用来自另一个数据框的名称重命名列

  3. 3

    使用来自另一个数据框的名称重命名列

  4. 4

    使用来自另一个数据框的值更新数据框标头

  5. 5

    使用来自另一个数据框的索引替换数据框中的行

  6. 6

    如何使用来自另一个数据框的随机值更新Pyspark中的数据框?

  7. 7

    R:使用来自另一个数据框的映射在一个数据框中创建一个新列

  8. 8

    使用来自另一个数据框的值作为R中的变量名称来对数据框进行变异

  9. 9

    使用来自另一个数据框的值创建新的dask数据框列会导致“块大小未知”错误

  10. 10

    通过比较列,用来自另一个数据框列的值填充 NaN

  11. 11

    根据来自另一个数据框的值创建新的数据框

  12. 12

    根据来自另一个数据框的值将数据框拆分为多个数据框

  13. 13

    大熊猫:使用来自另一个数据框的重复行更新多个数据框列

  14. 14

    根据来自另一个的组值填充一个数据框

  15. 15

    如何基于另一个数据框更改数据框的元素?

  16. 16

    使用pd.merge映射一个数据框中来自另一个数据框的多个列的值

  17. 17

    使用另一个数据框的唯一值创建并填充一个数据框

  18. 18

    根据来自另一个数据框的值查找数据框值的平均值

  19. 19

    基于&运算的子集pandas数据框来自另一个数据框的列

  20. 20

    R:创建新的数据框行是来自另一个数据框的列

  21. 21

    使用另一个在一个数据框中搜索值

  22. 22

    如何向一个数据框添加与来自另一个数据框的矢量的相等值相对应的值

  23. 23

    用另一个数据框的值替换一个数据框的列值

  24. 24

    根据另一个数据框的值填充一个数据框的值

  25. 25

    熊猫用另一个数据框的值替换一个数据框的值

  26. 26

    根据dplyr与另一个数据框的匹配来更改数据框中的列名称

  27. 27

    如何访问另一个数据框中的列表/数据框值

  28. 28

    保留另一个数据框中包含的数据框的值

  29. 29

    遍历数据框并替换为另一个数据框的值

热门标签

归档