Python 我写了一个脚本,它根据一个条件生成一个新的数据帧,如何使它更有效?

Python 我写了一个脚本,它根据一个条件生成一个新的数据帧,如何使它更有效?,python,pandas,dataframe,Python,Pandas,Dataframe,这是我的密码 df = *some df coin = *some string color = 'red' events = pd.DataFrame() events['date'] = df.date events['event'] = np.NaN data_list = [] for i in range(len(df)): if df.iloc[i].color == color: data_list.append(1) else:

这是我的密码

df = *some df 
coin = *some string
color = 'red'

events = pd.DataFrame()
events['date'] = df.date
events['event'] = np.NaN

data_list = []
for i in range(len(df)):
    if df.iloc[i].color == color:
        data_list.append(1)
    else:
        data_list.append(np.NaN)

events['event'] = l
从原始数据帧开始,如果颜色=‘红色’,则新数据帧(
事件
)中的相应日期应为1

我知道你可能一行就能做到,但我不知道怎么做

奖金问题执行此操作后,我将索引重置为日期列,这是我以前无法执行的操作,因为iloc无法使用范围I->len(df)


有很多不同的方法可以做到这一点

e、 g.使用列表理解构建一个系列

import pandas as pd
import numpy as np
df = pd.DataFrame({'color' : ['red', 'blue', 'red'],
                   'date'  : ['3/10/17', '4/10/17', '5/10/17']})

color_bools = pd.Series([1 if val == 'red' else np.nan for val in df['color']], 
                         index = df['date'].values)
color_bools

Out[18]:
3/10/17    1.0
4/10/17    NaN
5/10/17    1.0
dtype: float64

有很多不同的方法可以做到这一点

e、 g.使用列表理解构建一个系列

import pandas as pd
import numpy as np
df = pd.DataFrame({'color' : ['red', 'blue', 'red'],
                   'date'  : ['3/10/17', '4/10/17', '5/10/17']})

color_bools = pd.Series([1 if val == 'red' else np.nan for val in df['color']], 
                         index = df['date'].values)
color_bools

Out[18]:
3/10/17    1.0
4/10/17    NaN
5/10/17    1.0
dtype: float64
你需要:

样本:

df = pd.DataFrame({'color' : ['red', 'blue'],
                    'd'  : ['a', 'b']})

print (df)
  color  d
0   red  a
1  blue  b

df['event'] = np.where(df.color == 'red', 1, np.nan)
print (df)
  color  d  event
0   red  a    1.0
1  blue  b    NaN
另一个解决方案:

df.loc[df.color == 'red', 'event'] = 1
print (df)
  color  d  event
0   red  a    1.0
1  blue  b    NaN
性能类似:

df = pd.DataFrame({'color' : ['red', 'blue'],
                    'd'  : ['a', 'b']})
df = pd.concat([df]*100000).reset_index(drop=True)
print (df)

In [31]: %timeit df['event1'] = np.where(df.color == 'red', 1, np.nan)
10 loops, best of 3: 23.6 ms per loop

In [32]: %timeit df.loc[df.color == 'red', 'event'] = 1
10 loops, best of 3: 25.4 ms per loop
你需要:

样本:

df = pd.DataFrame({'color' : ['red', 'blue'],
                    'd'  : ['a', 'b']})

print (df)
  color  d
0   red  a
1  blue  b

df['event'] = np.where(df.color == 'red', 1, np.nan)
print (df)
  color  d  event
0   red  a    1.0
1  blue  b    NaN
另一个解决方案:

df.loc[df.color == 'red', 'event'] = 1
print (df)
  color  d  event
0   red  a    1.0
1  blue  b    NaN
性能类似:

df = pd.DataFrame({'color' : ['red', 'blue'],
                    'd'  : ['a', 'b']})
df = pd.concat([df]*100000).reset_index(drop=True)
print (df)

In [31]: %timeit df['event1'] = np.where(df.color == 'red', 1, np.nan)
10 loops, best of 3: 23.6 ms per loop

In [32]: %timeit df.loc[df.color == 'red', 'event'] = 1
10 loops, best of 3: 25.4 ms per loop