Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列表的dataframe列中用零替换负数_Python_Pandas_Dataframe_Apply - Fatal编程技术网

Python 在列表的dataframe列中用零替换负数

Python 在列表的dataframe列中用零替换负数,python,pandas,dataframe,apply,Python,Pandas,Dataframe,Apply,我有一个包含两列的数据框 第一列是日期索引 第二列的每一行都是包含负值的60个数字的列表 Spc 1976-10-31 15:00:00 [0.0124, 0.0096, 0.0325, 0.1562, 0.4494, 0.738...-1., -1., -1., -1.] 1976-11-01 03:00:00 [0.0254, 0.0299, 0.0273, 0.1229, 0.596, 0.9833...-1., -1., -1., -1.] 197

我有一个包含两列的数据框

第一列是日期索引

第二列的每一行都是包含负值的60个数字的列表

                    Spc
1976-10-31 15:00:00 [0.0124, 0.0096, 0.0325, 0.1562, 0.4494, 0.738...-1., -1., -1., -1.]
1976-11-01 03:00:00 [0.0254, 0.0299, 0.0273, 0.1229, 0.596, 0.9833...-1., -1., -1., -1.]
1976-11-01 15:00:00 [0.0226, 0.0236, 0.0269, 0.085, 0.4163, 0.8011...-1., -1., -1., -1.]
1976-11-02 03:00:00 [0.0132, 0.0154, 0.0172, 0.1336, 0.4743, 0.694...-1., -1., -1., -1.]
1976-11-02 15:00:00 [0.0124, 0.0169, 0.028, 0.5028, 1.4503, 1.6055...-1., -1., -1., -1.]
     :     :     :     :     :     :     :     :     :     :
2017-05-20 04:00:00 [5.374061e-13, 1.2720002e-06, 0.00052255474, 0...2.8157034e-03, 1.4578120e-03]
2017-05-20 04:30:00 [1.2021946e-12, 3.3477074e-06, 0.0014435094, 0...5.88221522e-03, 3.44922021e-03]
2017-05-20 05:00:00 [1.2236685e-13, 5.018357e-07, 0.00023753957, 0...2.28277827e-03, 1.07194704e-03]
2017-05-20 05:30:00 [3.5527579e-13, 1.1004944e-06, 0.0005480177, 0...2.0632602e-03, 1.6171171e-03]
2017-05-20 06:00:00 [4.968573e-13, 1.4969078e-06, 0.00065009575, 0...1.21051911e-03, 1.18123344e-03]
我想用零替换此列中的所有负值。

以下是前两行的完整数据:

1976-10-31 15:00:00[0.0013,0.0016,0.007,0.03,0.0803,0.2318,0.5842,0.8401,0.6,
0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,
0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,
0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,
0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,
0.,      0.,      0.,      0.,      0.,      0.,     -1.,     -1.,     -1.,
-1.,     -1.,     -1.,     -1.,     -1.,     -1.    ]
1976-11-01 03:00:00 [ 0.0022,  0.004,   0.0104,  0.0512,  0.1112,  0.2227,  0.5263,  0.7085,  0.4,
0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,
0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,
0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,
0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,      0.,
0.,      0.,      0.,      0.,      0.,      0.,     -1.,     -1.,     -1.,
-1.,     -1.,     -1.,     -1.,     -1.,     -1.    ]
目前,我的解决方案是将列表列转换为60列的单独df。然后我可以把这个df中的负数转换成零

# Convert the spectral ordinates from DF column of lists into columns
Spc = df_PRIM_SECO.Spc.apply(pd.Series)

# Set all negative values in DF to zero
Spc[Spc < 0] = 0
#将列表DF列的光谱坐标转换为列
Spc=df_PRIM_SECO.Spc.apply(pd.系列)
#将DF中的所有负值设置为零
Spc[Spc<0]=0
虽然这样做了,但是.apply()操作很慢(对于400000行的df需要1.3分钟)

有人能提供一个更高效(更快)的替代方案吗?

熊猫的运行速度比潜在的Numpy慢

所以也许你真正需要的就是“小屁股”

基于您的数据样本(20行,列表中有10个数字) 我准备了两个测试函数:

def f1():
    Spc = df.Spc.apply(pd.Series)
    Spc[Spc < 0] = 0

def f2():
    np.array([np.array(xi) for xi in df.Spc]).clip(min=0)
def f1():
Spc=df.Spc.apply(pd.系列)
Spc[Spc<0]=0
def f2():
NP.数组([NP.XI数组(席)在席夫.SPC]).剪辑(min=0)
我用%timeit检查了它们的执行时间,得到:

  • f1()为39.3毫秒
  • f2()为425µs
因此,基于Numpy的第二个函数的运行速度大约快了90倍

缺点是结果是一个Numpy数组,但是可能
这对您来说已经足够了。

这里有一些解决方案,以及一些基本的时间安排


设置代码和测试数据:

将numpy导入为np
作为pd进口熊猫
行数=100000
df_1=pd.DataFrame(data={'col_1':np.random.randint(0,100,num_行),
'col_2':np.random.uniform(-10,10,(num_行,60)).tolist()

1. <代码>应用(pd.Series):~18400毫秒
def func_1(df_in):
df_in=df_in.copy()
温度=df_in['col_2']。适用(pd系列)
温度[温度<0]=0
df_in['col_2']=温度到numpy().tolist()
返回df_in
2.列表理解:~460毫秒
def func_2(df_in):
df_in=df_in.copy()
df_in['col_2']=df_in['col_2'].map(lambda l:[0 if elem<0 else elem for elem in l])
返回df_in
3.@Valdi_Bo的溶液:~832 ms
def func_3(df_in):
df_in=df_in.copy()
['col_2']=np.array([np.array(elem)表示['col_2']]中df_中的元素)。clip(min=0)。tolist()
返回df_in
4.原则上与@Valdi_Bo的溶液相似:~926 ms
def func_4(df_in):
df_in=df_in.copy()
df_in['col_2']=np.stack(df_in['col_2'].to_numpy()).clip(min=0.tolist())
返回df_in
5.3和4的表亲:~691毫秒
def func_5(df_in):
df_in=df_in.copy()
df_in['col_2']=np.array(df_in['col_2'].tolist()).clip(min=0.tolist())
返回df_in


注:相对速度差保持在一个行数为10倍(1000000而不是100000)的输入上。

请您发布更清晰的样本(没有点的意思等),以便我们也可以测试代码。在pandas中,您不应该在列中存储列表之类的嵌套对象。在列中保留基本的原子类型(即,
bool
int
float
str
),以便进行适当的分析(即聚合、建模、绘图)。每一行与此类似:
0.0012、0.0012、0.0243、0.0904、0.1526、0.196、0.202、0.1468、0.1006、0.0855、0.0759、0.0547、0.0278、0.0162、0.0091、0.0096、,0.0096、0.0096、0.0096、0.0096、0.0096、0.0096、0.0117、0.0117、0.0089、0.0089、0.0072、0.0059、0.0042、0.0033、0.0103、0.0103、0.0103、0.0103、0.016、0.0228、0.0228、0.0.018、0.018、0.018、0.018、0.018、0.018、0.018、0.018、0.018、0.0008、0.0006、0.0006、0.0006、0.0004、0.0004、0.4、0.0004、0.4、0.0004、0.0004、0.0004、0.0004、0.0.0004、0.0.0004、0.0004、0.0.0.0 1.0,-1.0小心,变量名和函数名通常应遵循带有下划线的
小写形式!我知道你已经得到了答案,但是你能分享更多关于你的程序和数据吗?可能还有另一个数据结构更适合此任务。顺便问一下,是否要将结果分配回同一列?我之前没有注意到@Parfait的评论,但我完全同意。Valdi_-Bo,谢谢!你的解决方案真是太棒了!在这方面,JWYou甚至可以使用numba并减少计算时间again@NaturalFrequency哪个功能?所有这些?不,实际上你必须重写一个函数,让一个
numpy数组作为输入并在其上循环<代码>@njit def func_numba(arr):对于arr.shape中的i[0]:对于arr.shape中的j[1]:如果arr[i][j]<0:arr[i][j]=0
@naturalffrequency,您认为会有任何性能提升吗?你要试一试吗?我