如何使用此条件获得每行的每个答案

时间:2016-04-20 01:56:12

标签: python-2.7 date pandas dataframe

当我运行此代码时:

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()。

我是否有可能接近或离开。

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

2 个答案:

答案 0 :(得分:1)

' a'意思? 也许你想要

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

答案 1 :(得分: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

这是一个可怕的黑客,但应该是有效的:

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]