我已经创建了一个数据框架。我想根据当前数据框架的条件创建一个新的数据框架。我的Python代码如下:
df = pd.DataFrame({'A':[1,2,3,4,5,6,7,8,9,10],'B':[10,20,30,40,50,60,70,80,90,100]})
df
A B
0 1 10
1 2 20
2 3 30
3 4 40
4 5 50
5 6 60
6 7 70
7 8 80
8 9 90
9 10 100
import pywt
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
from skimage.restoration import denoise_wavelet
wavelet_type='db6'
def new_df(df):
df0 = pd.DataFrame()
if (df.iloc[:,0]>=1) & (df.iloc[:,0]<=3):
df0['B'] = denoise_wavelet(df.loc[(df.iloc[:,0]>=1) & (df.iloc[:,0]<=3),'B'], method='BayesShrink', mode='soft', wavelet_levels=3, wavelet='sym8', rescale_sigma='True')
elif (df.iloc[:,0]>=4) & (df.iloc[:,0]<=6):
df0['B'] = denoise_wavelet(df.loc[(df.iloc[:,0]>=4) & (df.iloc[:,0]<=6),'B'], method='BayesShrink', mode='soft', wavelet_levels=3, wavelet='sym8', rescale_sigma='True')
else:
df0['B']=df.iloc[:,1]
return df0
我想要一个新的数据框,它将去噪B列中满足条件的值,但保留剩余的值,并将它们保留在新的数据框中。我的代码给了我一个错误消息:ValueError: Series的真值是不明确的。使用a.empty a.bool (), a.item (), a.any()或所有()。你能帮帮我吗?
我想要的输出应该是
A B
0 1 15*
1 2 25*
2 3 35*
3 4 45*
4 5 55*
5 6 65*
6 7 70
7 8 80
8 9 90
9 10 100
#* represents new values may be different when you get the result.
#this is just for a demo.
可能是我的代码思路是错误的。你能帮帮我吗?
(df.iloc[:,0]>=1)
将返回一系列布尔值,这些布尔值对应df的第一列中大于等于1的元素。
if (df.iloc[:,0]>=1) & (df.iloc[:,0]<=3):
因此你试图用两个熊猫级数做布尔算术,这是没有意义的。
Pandas在错误信息中给你一个提示,告诉你如何解决这个问题:例如,如果你想检查df.iloc[:,0]
中的任何元素是否大于1,你可以使用(df.iloc[:,0]>=1).any()
,它将返回一个bool值,然后你可以与(df.iloc[:,0]<=3).any()
的结果进行比较。如果没有更多关于问题的背景或你想做的事情,就很难进一步帮助你。
请注意,由于您在将数据传递给denoise_wavelet
时过滤了数据,因此实际上不需要if
语句,但是您应该将返回值分配给相同的"视图";数据框的。这是我的方法。它首先复制原始DataFrame,并将所需的行替换为"去噪"的行。数据。
import numpy as np
import pandas as pd
import scipy.signal as signal
import matplotlib.pyplot as plt
from skimage.restoration import denoise_wavelet
wavelet_type='db6'
df = pd.DataFrame({'A':[1,2,3,4,5,6,7,8,9,10],'B':[10,20,30,40,50,60,70,80,90,100]})
def new_df(df):
df0 = df.copy()
df0.loc[(df.iloc[:,0]>=1) & (df.iloc[:,0]<=3),'B'] = denoise_wavelet(df.loc[(df.iloc[:,0]>=1) & (df.iloc[:,0]<=3),'B'].values, method='BayesShrink', mode='soft', wavelet_levels=3, wavelet='sym8', rescale_sigma='True')
df0.loc[(df.iloc[:,0]>=4) & (df.iloc[:,0]<=6),'B'] = denoise_wavelet(df.loc[(df.iloc[:,0]>=4) & (df.iloc[:,0]<=6),'B'].values, method='BayesShrink', mode='soft', wavelet_levels=3, wavelet='sym8', rescale_sigma='True')
return df0
new_df(df)
然而,我真的不知道denoise_wavelet
,所以我不知道结果是否正确,但从索引6
到9
的值保持不变。
更新用于申请2或更多列:
df = pd.DataFrame({'A':[1,2,3,4,5,6,7,8,9,10],
'B1':[10,20,30,40,50,60,70,80,90,100],
'B2':[10,20,30,40,50,60,70,80,90,100],
'B3':[10,20,30,40,50,60,70,80,90,100]})
def apply_denoise(col):
col.loc[1:3] = denoise_wavelet(col.loc[1:3], method='BayesShrink', mode='soft', wavelet_levels=3, wavelet='sym8', rescale_sigma='True')
col.loc[4:6] = denoise_wavelet(col.loc[4:6], method='BayesShrink', mode='soft', wavelet_levels=3, wavelet='sym8', rescale_sigma='True')
return col
new_df = df.set_index('A').apply(apply_denoise)
new_df
请注意,由于您总是对列'A'进行条件设置,因此您可以将其转换为索引并使用索引来实现条件。然后使用apply,您可以对每个列调用apply_denoise
函数,它将返回一个包含结果列的新DataFrame。