【问题标题】:pandas iterate thru column to find text match, once found compare the adjacent row values <> in both dataframespandas 遍历列以查找文本匹配,一旦找到,比较两个数据帧中的相邻行值 <>
【发布时间】:2020-07-28 04:29:03
【问题描述】:

尝试学习迭代或循环遍历 pandas 中的列的方法。在 vba 中,这是一个 for 循环,然后从选定的单元格位置选择偏移量,这只是一个选项。但是,我来这里是为了学习 pandas,并且很难理解如何在将下一列与右侧的邻接或两列进行比较时保持行直。另一种说法可能是这样。在其他数据框 mtype 列中找到 ttype 列文本后,我想将两个数据框中的相邻值相互比较。

我已附上数据框进行测试。我不确定 for 循环是否是实现这一目标的最佳方法,但我已经开始了。我读到 pandas 一次处理整个专栏的效率更高。不确定是否可以在这里完成。我的前 3 行代码(2 个 for 循环和 if 语句)正在工作。它循环遍历文本并找到匹配项。但我正在努力处理邻接值。我已经阅读了 iloc 和 loc 语句,因为我觉得它们抓住了行。但我不确定语法。我什至不确定我是否可以提出正确的问题来让我到达我需要的地方,以便我可以学习。因此,您可以帮助指导我了解这方面的任何阅读材料将不胜感激。 pandas loc vs. iloc vs. ix vs. at vs. iat? get column value based on another column with list of strings in pandas dataframe

需要什么:对于 toc 数据框,我想循环遍历 ttype 列中的每个值,如果值存在于 moc 数据框 mtype 列中,则比较 toc[ta column value]

import pandas as pd
from pandas import DataFrame, Series
import numpy as np

toc = {'ttype':['ta1k', 'brek', 'sjfgd',
           'gru2d','brek','crhe','ta1k','jump4'],
       'ta':[1, 2, 9, 9, 2, 2, 1, 1],
       'tc':[0, 1, 0, 0, 1, 0, 2, 0],
       'outfilter':[0, 0, 0, 0,0, 0, 0, 0]}

toc = pd.DataFrame(toc)

moc = {'mtype':[ 'sjfgd','ta1k','gru2d',
            'brek','crhe','jump4'],
       'mo':[2, 2, 4, 4, 3, 4],
       'ma':[2, 2, 4, 4, 2, 3],
       'mc':[1, 1, 3, 3, 1, 1]}

moc = pd.DataFrame(moc)

#-----
for tval in toc['ttype']:                          # Gets toc['ttype'].value
    for mval in moc['mtype']:                      # Gets toc['mtype'].value
        if t == m:                                 # compares if tval == mval
            if toc.loc['ta'] < moc.loc['ma']:      # compares toc.[ta] column value < moc.[ma]
                continue
            else:
                toc.loc['outfilter'] = '1'         # if the above is greater place '1' in outfilter 
                                                   #  column
        else:
            continue
#-----
 print(toc)
 print(moc)


 What I would like to do:  The '1's located in the outfilter column are a result of the toc-df[ta 
 column value] being greater than moc-df[ma column value]. 

 toc-df  ttype   ta   tc   outfilter
     0   ta1k    1    0    0
     1   brek    2    1    0
     2   sjfgd   9    0    1
     3   gru2d   9    0    1
     4   brek    2    1    0
     5   crhe    2    0    0
     6   ta1k    1    2    0
     7   jump4   1    0    0

我真的很感谢你们的帮助,我希望有一天我能回报这个人情并把它付诸实践。感谢您的时间。!!!如果您有任何问题,请告诉我。

【问题讨论】:

    标签: python pandas


    【解决方案1】:
    1. 我会合并 ttypemtype 列上的数据框,类似于在 Excel 中进行索引匹配/vlookup,但您不想合并整个 moc 数据框,因此只需指定并合并您需要的列(mtypema)。
    2. 从那里,只需执行np.where 以查看ta 值是否大于ma 值并返回10,类似于Excel if 公式。
    3. 最后,删除不需要的列

    输入:

    import pandas as pd, numpy as np
    toc = {'ttype':['ta1k', 'brek', 'sjfgd',
           'gru2d','brek','crhe','ta1k','jump4'],
       'ta':[1, 2, 9, 9, 2, 2, 1, 1],
       'tc':[0, 1, 0, 0, 1, 0, 2, 0],
       'outfilter':[0, 0, 0, 0,0, 0, 0, 0]}
    
    toc = pd.DataFrame(toc)
    
    moc = {'mtype':[ 'sjfgd','ta1k','gru2d',
            'brek','crhe','jump4'],
       'mo':[2, 2, 4, 4, 3, 4],
       'ma':[2, 2, 4, 4, 2, 3],
       'mc':[1, 1, 3, 3, 1, 1]}
    
    moc = pd.DataFrame(moc)
    

    代码:

    toc = pd.merge(toc,moc[['mtype','ma']],how='left',left_on='ttype',right_on='mtype')
    toc['outfilter'] = np.where((toc['ta'] > toc['ma']),1,0)
    toc = toc.drop(['mtype','ma'], axis=1)
    toc
    

    逐行分解代码:

    第 1 步(类似于 excel index-match 公式):

    pd.merge(toc,moc[['mtype','ma']],how='left',left_on='ttype',right_on='mtype')
    
       ttype  ta  tc  outfilter  mtype  ma
    0   ta1k   1   0          0   ta1k   2
    1   brek   2   1          0   brek   4
    2  sjfgd   9   0          0  sjfgd   2
    3  gru2d   9   0          0  gru2d   4
    4   brek   2   1          0   brek   4
    5   crhe   2   0          0   crhe   2
    6   ta1k   1   2          0   ta1k   2
    7  jump4   1   0          0  jump4   3
    

    第 2 步(类似于 excel IF 公式):

    toc['outfilter'] = np.where((toc['ta'] > toc['ma']),1,0)
    
        ttype  ta  tc  outfilter  mtype  ma
    0   ta1k   1   0          0   ta1k   2
    1   brek   2   1          0   brek   4
    2  sjfgd   9   0          1  sjfgd   2
    3  gru2d   9   0          1  gru2d   4
    4   brek   2   1          0   brek   4
    5   crhe   2   0          0   crhe   2
    6   ta1k   1   2          0   ta1k   2
    7  jump4   1   0          0  jump4   3
    

    第 3 步 - 最终输出(只是删除不需要的列):

    toc = toc.drop(['mtype','ma'], axis=1)
    
       ttype  ta  tc  outfilter
    0   ta1k   1   0          0
    1   brek   2   1          0
    2  sjfgd   9   0          1
    3  gru2d   9   0          1
    4   brek   2   1          0
    5   crhe   2   0          0
    6   ta1k   1   2          0
    7  jump4   1   0          0
    

    如果我想得更多,可能有一种更简单的方法在 python 中使用 pandas 方法只需一行 cod 即可完成此操作,但这种方法足够简单且易于理解。

    此外,VBA 也是我在大约 18 个月前从 Pandas 切换到的语言。我想说 99% 的问题都可以通过 pandas 方法、列表理解或.apply(lambda x:... 来解决。 Pandas 方法或 numpy 方法在简单性、速度、性能等方面总是要走的路。在 VBA 中循环非常流行,但你应该尽可能快地摆脱它,并学习各种 pandas方法。

    【讨论】:

    • 大卫,我对此印象深刻。很简单,它可以像黄油一样减少 5k 条记录。在测试的片刻,我对合并、如何、left_on、right_on 语句感到不确定。但他们似乎工作。我不确定目前如何。你能解释一下或指导我阅读一些你喜欢的阅读材料吗?我有点认为这是将列移动到 TOC df 中的合并位置或位置,但现在我认为这实际上是我首先提到的文本查找,以便引导每一行中的正确数字.
    • 我什至用你的 sn-p 来计算两列的总和大于另一列。我真的没有太多的 numpy 所以需要更多的练习。再次。非常感谢您的回复!!我真的很感激..!!
    • “left_on”和“right_on”是必需的,因为列的名称不同。如果它们都是同名,那么您可以删除“left_on”和“right_on”并简单地使用“on”。此外,假设列数相同,pandas 可以轻松地在超过 2000 万行上执行此操作,而基于 pandas 构建的名为“dash”的大数据库可以轻松地在数十亿行上执行此类操作。当您对 pandas 或 dask 使用矢量化方法时,就像在遥控器上按一次频道 44,而不是在频道 1 上按频道向上按钮 44 次。
    • 互联网上有丰富的知识,因为 python 是世界上最流行的编程语言之一,pandas 被标记为所有 python 问题的 10%,所以如果你用谷歌搜索正确的问题,如果您研究并吸收您正在阅读的内容,您可能会得到任何问题的答案
    • 嘿大卫,很好的信息。我有很多阅读要做。但我有一个关于 np.where 的更具操作性的问题。我希望我能正确地问这个问题。代码如何迭代/循环/或测试是否为真 toc.ttype 与已合并的 toc.mtype 文本列。?我要问的原因是,必须在 mtype 列中找到 ttype 值,以便正确比较右侧的 toc.ta > toc.ma 值。我可以理解 toc.ta > toc.ma 比较行。但我不知道代码如何知道要比较的正确值。与 toc.ma 相比,我不能只有 toc.ta。 np. 也许在哪里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    相关资源
    最近更新 更多