假设我有一个包含四列的DataFrame,每列都有一个阈值,我希望根据该值来比较DataFrame的值。
我只想了解DataFrame的最小值或阈值。
例如:
df = pd.DataFrame(np.random.randn(100,4), columns=list('ABCD'))
>>> df.head()
A B C D
0 -2.060410 -1.390896 -0.595792 -0.374427
1 0.660580 0.726795 -1.326431 -1.488186
2 -0.955792 -1.852701 -0.895178 -1.353669
3 -1.002576 -0.321210 1.711597 -0.063274
4 1.217197 0.202063 -1.407561 0.940371
thresholds = pd.Series({'A': 1, 'B': 1.1, 'C': 1.2, 'D': 1.3})
此解决方案有效(A4和C3已过滤),但必须有一种更简单的方法:
df_filtered = df.lt(thresholds).multiply(df) + df.gt(thresholds).multiply(thresholds)
>>> df_filtered.head()
A B C D
0 -2.060410 -1.390896 -0.595792 -0.374427
1 0.660580 0.726795 -1.326431 -1.488186
2 -0.955792 -1.852701 -0.895178 -1.353669
3 -1.002576 -0.321210 1.200000 -0.063274
4 1.000000 0.202063 -1.407561 0.940371
理想情况下,我想使用.loc进行过滤,但我还没有设法解决这个问题。我使用Pandas 0.14.1(并且无法升级)。
回复以下是针对替代方案的初步提案的定时测试:
%%timeit
df.lt(thresholds).multiply(df) + df.gt(thresholds).multiply(thresholds)
1000 loops, best of 3: 990 µs per loop
%%timeit
np.minimum(df, thresholds) # <--- Simple, fast, and returns DataFrame!
10000 loops, best of 3: 110 µs per loop
%%timeit
df[df < thresholds].fillna(thresholds, inplace=True)
1000 loops, best of 3: 1.36 ms per loop
答案 0 :(得分:3)
这非常快(并返回一个数据帧):
np.minimum( df, [1.0,1.1,1.2,1.3] )
令人惊喜的是,numpy如此顺从,没有任何重塑或明确的转换......
答案 1 :(得分:1)
怎么样:
df[df < thresholds].fillna(thresholds, inplace=True)