【问题标题】:How do I get each answer for each row with this conditional如何使用此条件获得每一行的每个答案
【发布时间】:2016-08-12 11:08:27
【问题描述】:

当我运行这段代码时:

df = pd.read_csv('example.txt', parse_dates = [["DATE", "TIME"]], index_col=0)

b930 = df.HIGH.at_time("09:30:00")

print b930

a=0
if (b930 > 3046.00).any():
   a = 7
else:
   a = 10
print a

对于这个 csv:

 DATE,TIME,OPEN,HIGH,LOW,CLOSE,VOLUME
 02/03/1997,09:30:00,3045.00,3045.00,3045.00,3045.00,28 
 02/04/1997,09:30:00,3077.00,3078.00,3077.00,3077.50,280
 02/05/1997,09:30:00,3094.00,3094.50,3094.00,3094.00,50 
 02/06/1997,09:30:00,3106.00,3107.50,3106.00,3107.50,53
 02/07/1997,09:30:00,3144.00,3144.00,3143.50,3143.50,15 
 02/06/1997,16:20:00,3126.50,3126.50,3126.00,3126.00,24           
 02/06/1997,16:21:00,3126.50,3128.00,3126.50,3128.00,169          
 02/06/1997,16:22:00,3128.00,3128.00,3126.00,3126.00,243          
 02/06/1997,16:23:00,3125.50,3126.50,3125.50,3125.50,26     

对于 5 个不同的行,我只得到一个答案。我如何得到每一行的答案。

我已经浏览了整个互联网。 我已经尝试了几个不同的版本。

df['logic'] = np.where(df['AAA'] > 5,'high','low'); df

我已经尝试了所有这些 .empty、a.bool()、a.item()、a.any() 或 a.all()。

有没有可能我离得很近或刚刚离开。

非常感谢,如果没有这个网站或非常慷慨的程序员社区,我不知道该怎么办!

【问题讨论】:

    标签: python-2.7 date pandas dataframe


    【解决方案1】:
    df = pd.read_csv('example.txt')
    df.set_index(pd.to_datetime(df.DATE + ' ' + df.TIME), inplace=True)
    df.drop(['DATE', 'TIME'], axis=1, inplace=True)
    
    >>> df
                           OPEN    HIGH     LOW   CLOSE  VOLUME
    1997-02-03 09:30:00  3045.0  3045.0  3045.0  3045.0      28
    1997-02-04 09:30:00  3077.0  3078.0  3077.0  3077.5     280
    1997-02-05 09:30:00  3094.0  3094.5  3094.0  3094.0      50
    1997-02-06 09:30:00  3106.0  3107.5  3106.0  3107.5      53
    1997-02-07 09:30:00  3144.0  3144.0  3143.5  3143.5      15
    1997-02-06 16:20:00  3126.5  3126.5  3126.0  3126.0      24
    1997-02-06 16:21:00  3126.5  3128.0  3126.5  3128.0     169
    1997-02-06 16:22:00  3128.0  3128.0  3126.0  3126.0     243
    1997-02-06 16:23:00  3125.5  3126.5  3125.5  3125.5      26
    
    >>> df.HIGH.at_time('9:30')
    1997-02-03 09:30:00    3045.0
    1997-02-04 09:30:00    3078.0
    1997-02-05 09:30:00    3094.5
    1997-02-06 09:30:00    3107.5
    1997-02-07 09:30:00    3144.0
    Name: HIGH, dtype: float64
    
    a = 7 if (df.HIGH.at_time('09:30') > 3046).any() else 10
    
    >>> a
    7
    

    我讨厌map,但它在这里起到了作用:

    >>> h.map(lambda x: 7 if x > 3046 else 10)
    1997-02-03 09:30:00    10
    1997-02-04 09:30:00     7
    1997-02-05 09:30:00     7
    1997-02-06 09:30:00     7
    1997-02-07 09:30:00     7
    Name: HIGH, dtype: int64
    

    这是一个糟糕的 hack,但应该很有效:

    true_val = 7
    false_val = 10
    
    >>> (df.HIGH.at_time('09:30') > 3046) * (false_val - true_val) + true_val
    1997-02-03 09:30:00     7
    1997-02-04 09:30:00    10
    1997-02-05 09:30:00    10
    1997-02-06 09:30:00    10
    1997-02-07 09:30:00    10
    Name: HIGH, dtype: int64
    

    这会让你返回一个 numpy 数组:

    >>> np.where(df.HIGH.at_time("09:30:00") > 3046, 7, 10)
    array([10,  7,  7,  7,  7])
    

    或者您可以使用列表推导:

    >>> [7 if val > 3046 else 10 for val in df.HIGH.at_time("09:30:00")]
    [10, 7, 7, 7, 7]
    

    【讨论】:

      【解决方案2】:

      'a' 是什么意思? 也许你想要

      b930.map(lambda x: 7 if x>3046 else 10)
      

      【讨论】:

      • 'a' 是我认为我必须做的事情来定义一个值为 true 和 false 我可能是错误的 idk。
      • @PhilChang 我想应该是b930.map,即没有HIGH,因为b930是一个没有列名的系列。
      猜你喜欢
      • 2020-02-14
      • 2022-01-25
      • 2022-10-26
      • 2018-07-25
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      相关资源
      最近更新 更多