从另一个数据框创建新的数据框



我已经创建了一个数据框架。我想根据当前数据框架的条件创建一个新的数据框架。我的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,所以我不知道结果是否正确,但从索引69的值保持不变。

更新用于申请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。

相关内容

  • 没有找到相关文章

最新更新