有条件地更改每个索引和列中数据框的值的最快方法是什么?

时间:2018-12-31 20:36:32

标签: python python-3.x pandas numpy

是否有一种方法可以将数据框的每个元素减少一个常数,从而无需使用循环就可以验证包含其自身值的条件?

例如,每个<2的单元格的值都会减少1。

非常感谢您。

4 个答案:

答案 0 :(得分:3)

我喜欢做这种蒙版。 这是使用您的示例的低效率循环

 #Example using loop
 for val in df['column']:
      if(val<2):
           val = val - 1

以下代码给出的结果相同,但是由于它不使用循环,因此通常会更快。

 # Same effect using masks
 mask = (df['column'] < 2) #Find entries that are less than 2.
 df.loc[mask,'column'] = df.loc[mask,'column'] - 1 #Subtract 1.

答案 1 :(得分:0)

我不确定这是否最快,但是您可以使用.apply函数:

import pandas as pd
df = pd.DataFrame(data=np.array([[1,2,3], [2,2,2], [4,4,4]]), 
                  columns=['x', 'y', 'z'])

def conditional_add(x):
    if x > 2:
        return x + 2
    else:
        return x

df['x'] = df['x'].apply(conditional_add)

将x的最后一行加2。

答案 2 :(得分:0)

更像(来自Willie的数据)

df-((df<2)*2)
Out[727]: 
    x  y  z
0  -1  2  3
1   2  2  2
2   4  4  4

答案 3 :(得分:0)

在这种情况下,我将使用NumPy库中的np.where方法。
该方法使用以下逻辑:
np.where(<condition>, <value if true>, <value if false>)

示例:

# import modules which are needed
import pandas as pd
import numpy as np

# create exmaple dataframe
df = pd.DataFrame({'A':[3,1,5,0.5,2,0.2]})

|  A  |
|-----|
|   3 |
|   1 |
|   5 |
| 0.5 |
|   2 |
| 0.2 |

# apply the np.where method with conditional statement
df['A'] = np.where(df.A < 2, df.A - 1, df.A)

|  A   |
|------|
|    3 |
|  0.0 |
|    5 |
| -0.5 |
|    2 |
| -0.8 |`