Python 熊猫数据帧

Python 熊猫数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个关于以下代码的问题, 我有一个数据集和一个列表,我想将我的数据集的每个数据值与两个条件进行比较,如果条件为真,则保留数据帧的前一个值,否则将其设置为无,我的代码对小数据集非常有效,但它会花费太多时间,并且对我的大数据集没有任何值。有更好的解决办法吗 new_data=data for col in df.columns: for i in range(len(df)): if (df.iloc[i][col] >list_min[i]

我有一个关于以下代码的问题, 我有一个数据集和一个列表,我想将我的数据集的每个数据值与两个条件进行比较,如果条件为真,则保留数据帧的前一个值,否则将其设置为无,我的代码对小数据集非常有效,但它会花费太多时间,并且对我的大数据集没有任何值。有更好的解决办法吗

new_data=data
    for col in df.columns:
        for i in range(len(df)):
            if (df.iloc[i][col] >list_min[i] ) & (df.iloc[i][col]<list_max[i]):
                new_data.set_value(i,col,df.iloc[i][col])
            else:
                new_data.set_value(i,col,None)
new_data=数据
对于df.列中的列:
对于范围内的i(len(df)):
if(df.iloc[i][col]>list_min[i])&(df.iloc[i][col]min_list[j])&(data.iloc[i][col]考虑使用if/then/else习惯用法。下面假设list_min和list_max是长度与数据行数相等的列表

操作

new_data = data.loc[:,]

for col in data.columns:
        new_data.loc[(data[col] > pd.Series(list_min)) & 
                     (data[col] < pd.Series(list_max)), col] = data[col] 

        new_data.loc[(data[col] < pd.Series(list_min)) |
                     (data[col] > pd.Series(list_max)), col] = None

print(new_data.head())
#       0     1     2     3     4     5     6     7     8    9
# 0   NaN   NaN  37.0   NaN   NaN   NaN   NaN   NaN   NaN  NaN
# 1  25.0   NaN  28.0   NaN  36.0  22.0   NaN  24.0  28.0  NaN
# 2   NaN   NaN   NaN  35.0   NaN   NaN  40.0  41.0  38.0  NaN
# 3   NaN   NaN   NaN  31.0  38.0   NaN   NaN   NaN  32.0  NaN
# 4  11.0  30.0   NaN   NaN  20.0   NaN  26.0   NaN   NaN  5.0
new_data=data.loc[:,]
对于data.columns中的列:
新的_data.loc[(数据[col]>pd.Series(列表_min))&
(数据[col]pd.系列(列表_max)),col]=无
打印(新的_data.head())
#       0     1     2     3     4     5     6     7     8    9
#0楠楠37.0楠楠楠楠
#1 25.0 NaN 28.0 NaN 36.0 22.0 NaN 24.0 28.0 NaN
#2楠楠35.0楠楠40.0 41.0 38.0楠楠
#3楠楠31.0 38.0楠楠32.0楠楠楠
#4 11.0 30.0楠楠20.0楠楠26.0楠楠5.0
考虑使用if/then/else习惯用法。下面假设list_min和list_max是长度等于数据行数的列表

操作

new_data = data.loc[:,]

for col in data.columns:
        new_data.loc[(data[col] > pd.Series(list_min)) & 
                     (data[col] < pd.Series(list_max)), col] = data[col] 

        new_data.loc[(data[col] < pd.Series(list_min)) |
                     (data[col] > pd.Series(list_max)), col] = None

print(new_data.head())
#       0     1     2     3     4     5     6     7     8    9
# 0   NaN   NaN  37.0   NaN   NaN   NaN   NaN   NaN   NaN  NaN
# 1  25.0   NaN  28.0   NaN  36.0  22.0   NaN  24.0  28.0  NaN
# 2   NaN   NaN   NaN  35.0   NaN   NaN  40.0  41.0  38.0  NaN
# 3   NaN   NaN   NaN  31.0  38.0   NaN   NaN   NaN  32.0  NaN
# 4  11.0  30.0   NaN   NaN  20.0   NaN  26.0   NaN   NaN  5.0
new_data=data.loc[:,]
对于data.columns中的列:
新的_data.loc[(数据[col]>pd.Series(列表_min))&
(数据[col]pd.系列(列表_max)),col]=无
打印(新的_data.head())
#       0     1     2     3     4     5     6     7     8    9
#0楠楠37.0楠楠楠楠
#1 25.0 NaN 28.0 NaN 36.0 22.0 NaN 24.0 28.0 NaN
#2楠楠35.0楠楠40.0 41.0 38.0楠楠
#3楠楠31.0 38.0楠楠32.0楠楠楠
#4 11.0 30.0楠楠20.0楠楠26.0楠楠5.0

如果我正确理解您正在做的事情,您可以在以下几个地方尝试矢量化。看看这是否加快了速度:

q75s = data.quantile(.75)
q25s = data.quantile(.25)
mins = 2.5*q25s - 1.5*q75s
maxs = 2.5*q75s - 1.5*q25s

newdata = data.copy()
newdata[(data < mins) | (data > maxs)] = None
q75s=数据分位数(.75)
q25s=数据分位数(.25)
分钟=2.5*q25s-1.5*q75s
最大值=2.5*q75s-1.5*q25s
newdata=data.copy()
新数据[(数据<分钟)|(数据>最大值)]=无

如果我正确理解您正在做的事情,您可以在以下几个地方尝试矢量化。看看这是否加快了速度:

q75s = data.quantile(.75)
q25s = data.quantile(.25)
mins = 2.5*q25s - 1.5*q75s
maxs = 2.5*q75s - 1.5*q25s

newdata = data.copy()
newdata[(data < mins) | (data > maxs)] = None
q75s=数据分位数(.75)
q25s=数据分位数(.25)
分钟=2.5*q25s-1.5*q75s
最大值=2.5*q75s-1.5*q25s
newdata=data.copy()
新数据[(数据<分钟)|(数据>最大值)]=无

什么是list_min和list_max?它看起来与
df的长度相同。我在我的小数据集中使用了相同的长度。但在其他数据集中,我读取了list_min和list_max的长度。
对于数据中的列。列:对于(I,j)in[(I,j)对于范围内的I(len(data)),对于范围内的j(len(min_list))]:
不确定这是如何回答我的问题的。这些对象从何而来?很难理解您的代码实际想要实现什么。一般来说,如果您不手动编码所有循环,而是使用向量或矩阵运算,则速度会快得多。什么是list_min和list_max?它看起来与
df
长度相同。我使用了在我的小数据集中,长度相同。但在其他数据集中,我读取数据列中列的最小值和最大值。
。列:对于(I,j)in[(I,j)对于范围内的I(len(data)),对于范围内的j(len(min_list))]:
不确定这是如何回答我的问题的。这些对象从何而来?很难理解您的代码实际想要实现什么。一般来说,如果您不手动编写所有循环,而是使用向量或矩阵运算,则速度会快得多。感谢您,但列表的长度与数据帧的行不同,这是正确的与列的长度相同。谢谢,但是列表的长度与数据框的行不同,它与列的长度相同。
q75s = data.quantile(.75)
q25s = data.quantile(.25)
mins = 2.5*q25s - 1.5*q75s
maxs = 2.5*q75s - 1.5*q25s

newdata = data.copy()
newdata[(data < mins) | (data > maxs)] = None