【问题标题】:Get value in csv file in same row在同一行的csv文件中获取值
【发布时间】:2018-05-29 21:49:13
【问题描述】:

因此,给定一个 csv 文件作为使用 pandas 和 python 的数据框,我想尽可能高效地获取与另一个值在同一行中的值

为了澄清这一点,我将用以下 csv 给你一个例子:

STAID   SOUID   DATE      TX     Q_TX
162     100522  19010101 -31     0
162     100522  19010102 -13     0
162     100522  19010103 -5      0
162     100522  19010104 -10     0
162     100522  19010105 -18     0

让我们说我正在实现以下代码

import pandas as pd

data = pd.read_csv("foo.csv")

max_val = data["TX"].max()

Max_val 现在将获得 -5 的值。问题是我现在想知道“DATE”中的值,它将与 max_val 在同一行中,或者换句话说:“DATE”列中的值与找到的值共享相同的索引。我的目标值是 19010103。仅使用 pandas 的最有效方法是什么?

更新:与 min_val 有点不同,它显然应该是 max_val 而不是 min_val。

【问题讨论】:

    标签: python pandas csv jupyter-notebook


    【解决方案1】:

    我们可以使用idxmax

    df.DATE[df.TX.idxmax()]
    Out[346]: 19010103
    

    为了提高速度

    df.values[2,df.TX.values.argmax()]
    

    【讨论】:

    • 10000 loops, best of 3: 77.6 µs per loop 哇!!这很快。可能微不足道,但 data['DATE'][data['TX'].idxmax()] 返回 10000 loops, best of 3: 60.2 µs per loop
    • 我真的很喜欢你的回答。我在测试中使用at 将其合并,以获得最快的结果。
    • @MattR aha,使用at 应该很快:-)
    • @MattR 您可以比 idxmax 更快地检查 numpy 方法。
    • 这很有趣...... numpy (略微)较慢。你有不同的想法吗?min_val = np.argmax(data['TX']) # 10000 loops, best of 3: 51 µs per loopmin_val = data.TX.idxmax() # 10000 loops, best of 3: 48.7 µs per loop
    【解决方案2】:

    使用loc 是“标准”,应该是高度可读的。但是在这里使用idxmaxat 是您最快的答案(请参阅温的答案以了解我的想法)。您可能希望使用您的真实数据进行测试,以确保这少量数据不会提供红鲱鱼。见at

    基于标签的快速标量访问器 与 loc 类似,at 提供基于标签的标量查找。您也可以使用这些索引器进行设置。

    我的测试中最快的答案:

    min_val = data.TX.idxmax() #with min_val's index already set
    %%timeit
    data.at[min_val,'DATE']
    # 100000 loops, best of 3: 6.73 µs per loop
    

    在jupyter上使用%%timeit可以看到时间:

    %%timeit
    data.loc[data['TX'] == min_val]['DATE']
    # 1000 loops, best of 3: 604 µs per loop
    
    %%timeit
    data[data['TX']==min_val)].DATE #using from comments, and not using loc
    # 1000 loops, best of 3: 724 µs per loop
    
    %%timeit
    data[data['TX']==data['TX'].max()]['DATE']
    #1000 loops, best of 3: 575 µs per loop 
    
    %%timeit
    data.at[data.TX.idxmax(),'DATE'] #using at and idxmax <----
    # 10000 loops, best of 3: 69.5 µs per loop
    
    %%timeit
    data.at[data.loc[data['TX'] == min_val].index[0],'DATE']
    # 1000 loops, best of 3: 560 µs per loop
    

    【讨论】:

    • 非常感谢!尽管 idxmax 解决方案更简单,但我更喜欢您的解决方案,因为它更通用
    • 这似乎与 microsoft excel 的 VLOOKUP 函数非常相似。这个 python 功能如何处理匹配查找条件的多行?例如,如果 3 行每行包含 -5
    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2015-07-21
    • 2016-09-24
    相关资源
    最近更新 更多