Python 在DataFrame列中设置最大值
我在panda dataframe中有以下数据点:Python 在DataFrame列中设置最大值,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我在panda dataframe中有以下数据点: DateTime Data 2017-11-21 18:54:31 1 2017-11-22 02:26:48 2 2017-11-22 10:19:44 3 2017-11-22 15:11:28 6 2017-11-22 23:21:58 7 2017-11-28 14:28:28 28 2017-11-28 14:36:40 0 2017-11-28 14
DateTime Data
2017-11-21 18:54:31 1
2017-11-22 02:26:48 2
2017-11-22 10:19:44 3
2017-11-22 15:11:28 6
2017-11-22 23:21:58 7
2017-11-28 14:28:28 28
2017-11-28 14:36:40 0
2017-11-28 14:59:48 1
我想应用一个函数将大于1的所有数据值转换为1:
有没有办法将以下两个lambda函数组合成一个函数(就像else语句)
您可以使用:
或者使用(=
)作为布尔掩码,并将其转换为int
,如果没有负值:
df['Data'] = df['Data'].ge(1).astype(int)
print (df)
DateTime Data
0 2017-11-21 18:54:31 1
1 2017-11-22 02:26:48 1
2 2017-11-22 10:19:44 1
3 2017-11-22 15:11:28 1
4 2017-11-22 23:21:58 1
5 2017-11-28 14:28:28 1
6 2017-11-28 14:36:40 0
7 2017-11-28 14:59:48 1
但如果想要使用列表理解(在更大的数据帧中应该更慢):
计时:
#[8000 rows x 5 columns]
df = pd.concat([df]*1000).reset_index(drop=True)
In [28]: %timeit df['Data2'] = df['Data'].clip_upper(1)
1000 loops, best of 3: 308 µs per loop
In [29]: %timeit df['Data3'] = df['Data'].ge(1).astype(int)
1000 loops, best of 3: 425 µs per loop
In [30]: %timeit df['Data1'] = [1 if x > 0 else x for x in df['Data']]
100 loops, best of 3: 3.02 ms per loop
#[800000 rows x 5 columns]
df = pd.concat([df]*100000).reset_index(drop=True)
In [32]: %timeit df['Data2'] = df['Data'].clip_upper(1)
100 loops, best of 3: 9.32 ms per loop
In [33]: %timeit df['Data3'] = df['Data'].ge(1).astype(int)
100 loops, best of 3: 4.76 ms per loop
In [34]: %timeit df['Data1'] = [1 if x > 0 else x for x in df['Data']]
1 loop, best of 3: 274 ms per loop
您可以使用:
或者使用(=
)作为布尔掩码,并将其转换为int
,如果没有负值:
df['Data'] = df['Data'].ge(1).astype(int)
print (df)
DateTime Data
0 2017-11-21 18:54:31 1
1 2017-11-22 02:26:48 1
2 2017-11-22 10:19:44 1
3 2017-11-22 15:11:28 1
4 2017-11-22 23:21:58 1
5 2017-11-28 14:28:28 1
6 2017-11-28 14:36:40 0
7 2017-11-28 14:59:48 1
但如果想要使用列表理解(在更大的数据帧中应该更慢):
计时:
#[8000 rows x 5 columns]
df = pd.concat([df]*1000).reset_index(drop=True)
In [28]: %timeit df['Data2'] = df['Data'].clip_upper(1)
1000 loops, best of 3: 308 µs per loop
In [29]: %timeit df['Data3'] = df['Data'].ge(1).astype(int)
1000 loops, best of 3: 425 µs per loop
In [30]: %timeit df['Data1'] = [1 if x > 0 else x for x in df['Data']]
100 loops, best of 3: 3.02 ms per loop
#[800000 rows x 5 columns]
df = pd.concat([df]*100000).reset_index(drop=True)
In [32]: %timeit df['Data2'] = df['Data'].clip_upper(1)
100 loops, best of 3: 9.32 ms per loop
In [33]: %timeit df['Data3'] = df['Data'].ge(1).astype(int)
100 loops, best of 3: 4.76 ms per loop
In [34]: %timeit df['Data1'] = [1 if x > 0 else x for x in df['Data']]
1 loop, best of 3: 274 ms per loop
带
np.clip的Numpy解决方案
df['Data'] = np.clip(df.Data.values, a_min=None, a_max=1)
df
DateTime Data
0 2017-11-21 18:54:31 1
1 2017-11-22 02:26:48 1
2 2017-11-22 10:19:44 1
3 2017-11-22 15:11:28 1
4 2017-11-22 23:21:58 1
5 2017-11-28 14:28:28 1
6 2017-11-28 14:36:40 0
7 2017-11-28 14:59:48 1
传递a_min=None
以指定无下限。np.clip的Numpy解决方案
df['Data'] = np.clip(df.Data.values, a_min=None, a_max=1)
df
DateTime Data
0 2017-11-21 18:54:31 1
1 2017-11-22 02:26:48 1
2 2017-11-22 10:19:44 1
3 2017-11-22 15:11:28 1
4 2017-11-22 23:21:58 1
5 2017-11-28 14:28:28 1
6 2017-11-28 14:36:40 0
7 2017-11-28 14:59:48 1
传递a_min=None
以指定无下限。这是一个很好的答案,np非常强大,但是,我将选择Jezrael作为最佳答案,因为它使用datafram的内部函数。尽管如此,我还是很感激。@user97662不是问题。我尊重你的决定。快乐的编码。@user97662尽管我应该提醒你们注意,我的答案比耶兹雷尔的最快答案好9倍。看看我的时间安排。如果性能很重要,我鼓励您重新考虑。这是一个很好的答案,np非常强大,但是,我选择Jezrael作为最佳答案,因为它使用datafram的内部函数。尽管如此,我还是很感激。@user97662不是问题。我尊重你的决定。快乐的编码。@user97662尽管我应该提醒你们注意,我的答案比耶兹雷尔的最快答案好9倍。看看我的时间安排。如果绩效很重要,我鼓励您重新考虑。
df['Data'] = np.clip(df.Data.values, a_min=None, a_max=1)
df
DateTime Data
0 2017-11-21 18:54:31 1
1 2017-11-22 02:26:48 1
2 2017-11-22 10:19:44 1
3 2017-11-22 15:11:28 1
4 2017-11-22 23:21:58 1
5 2017-11-28 14:28:28 1
6 2017-11-28 14:36:40 0
7 2017-11-28 14:59:48 1