函数中的函数,该函数涉及Python中数据帧的每一列

函数中的函数,该函数涉及Python中数据帧的每一列,python,pandas,function,dataframe,Python,Pandas,Function,Dataframe,正如问题所述,我试图学习如何在属于DataFrame中某列的每个元素上运行函数,而不必直接定义该列。关键是我希望能够输入任何给定的数据帧集,并在每个列中找到满足特定条件的每个元素 我所包含的示例说明了我正在尝试做的事情。我知道下面的内容不起作用,我认为编写def-fun(dataframe[column])就可以了,但遗憾的是语法不正确 基本上,这样做的原因是我有多组数据,我想在其中定位高于设定阈值的每个元素 提前多谢 df=pd.DataFrame(np.random.randint(0,10

正如问题所述,我试图学习如何在属于DataFrame中某列的每个元素上运行函数,而不必直接定义该列。关键是我希望能够输入任何给定的
数据帧集
,并在每个列中找到满足特定条件的每个元素

我所包含的示例说明了我正在尝试做的事情。我知道下面的内容不起作用,我认为编写
def-fun(dataframe[column])
就可以了,但遗憾的是语法不正确

基本上,这样做的原因是我有多组数据,我想在其中定位高于设定阈值的每个元素

提前多谢

df=pd.DataFrame(np.random.randint(0,100,size=(3, 3)), columns=list('ABC'))
def fun(dataframe):
  for column in dataframe:  
     def fun(column):  
        mean= sum(column)/len(column)
        print (mean)
        for element in column:
            if element < mean*1.1:
                element = 0
            print (element)
fun(df)      
df=pd.DataFrame(np.random.randint(0100,size=(3,3)),columns=list('ABC'))
def fun(数据帧):
对于dataframe中的列:
def fun(专栏):
平均值=总和(列)/长度(列)
打印(平均值)
对于列中的元素:
如果元素<平均值*1.1:
元素=0
打印(元素)
乐趣(df)

正如@MadPhysicast在评论中提到的,pandas的创建是为了减少显式循环的需要

如果我正确理解了您的具体情况,您打算将任何小于其列平均值1.1倍的元素替换为零。在惯用的熊猫中,有一种方法可以做到这一点:

# Set a random seed for repeatability
np.random.seed(314159)

# Create example data
df = pd.DataFrame(np.random.randint(0,100,size=(3, 3)), columns=list('ABC'))
df
    A   B   C
0  11  34  93
1  79   0  81
2  66  43  71

# By default, df.mean() computes the mean of each numeric column (not row)
df.mean()
A    52.000000
B    25.666667
C    81.666667
dtype: float64

# We can use boolean indexing to replace values less than
# 1.1 * column mean with zero
# docs: https://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing
df[df < 1.1 * df.mean()] = 0

df
    A   B   C
0   0  34  93
1  79   0   0
2  66  43   0
#为重复性设置随机种子
np.随机种子(314159)
#创建示例数据
df=pd.DataFrame(np.random.randint(0100,size=(3,3)),columns=list('ABC'))
df
A、B、C
0  11  34  93
1  79   0  81
2  66  43  71
#默认情况下,df.mean()计算每个数值列(而不是行)的平均值
df.mean()
52000000美元
B 25.666667
C 81.666667
数据类型:64
#我们可以使用布尔索引替换小于的值
#1.1*带零的列平均值
#文件:https://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-索引
df[df<1.1*df.mean()]=0
df
A、B、C
0   0  34  93
1  79   0   0
2  66  43   0

为什么需要内部函数(同时,它与外部函数同名)?另外,如果我理解正确,您应该能够在没有
for
循环的情况下完成所有这些。如果您当前的方法不起作用,最好包含一个输入和输出DF的小示例。pandas的全部目的是消除手动执行这些操作的需要。。。看看均值函数和条件赋值,因为我有多个csv文件,每个文件最多有100列。如果我不必一直写列名来运行函数,感觉会简化很多。谢谢!我来看看布尔索引。不建议为此任务使用函数吗?另外两个我认为有益的原因是:1)用平均数除以任何非零元素,得到一个更简单的刻度(我目前正在使用10^4,它看起来不太好,是任意的,不方便的)2)能够快速将代码应用到新的数据帧。这是因为我仍然必须在不同的条件下进行相同的实验测量,这意味着我最终将拥有大约18个不同的csv文件。为了进一步澄清,我已经通过使用
df.apply(fun_column,axis=0)
在每一列上应用函数来完成任务。然而,我仍然对替代方法感兴趣,因为我在用修改后的值“覆盖”旧数据框方面遇到了问题,就像您刚才所做的那样。执行代码后,每个新元素都被正确打印(我临时添加了一个打印函数,只是为了看看执行是否正确),但数据帧保持不变。我可能在返回值的方式上犯了错误。@Raydoc,我不会使用嵌套函数来完成此任务,因为pandas可以更快地完成此任务(如果您使用IPython/Jupyter,请将速度与
%timeit df[df<1.1*df.mean()]=0
%timeit fun(df)
)进行比较,并且更具可读性。有时,您需要自定义函数来
应用于DF的列,但在这种情况下,这太过分了。要按列平均值划分元素,只需运行
df/df.mean()
。零元素将不受影响。是的,我今早醒来时意识到了这一点。一定很困(大约凌晨4点)。就速度而言,您是否建议我避免添加一个函数?有了这个,我解决了一个数据帧的问题,但是复制粘贴代码多次以将其应用到另一个数据帧显然是很乏味的。你会用另一种方式吗?我使用Python只工作了大约一天,之前没有编程经验,所以显然还有很多东西需要学习。我真的很感谢你的反馈!如果我理解您的需求,我会说应用helper函数有点“冗长”,因为有一个快速可读的解决方案(一旦您习惯了!)。但是,如果您的代码现在可以工作,并且速度足够快,满足您的需要,那么几乎不需要修改它;程序员的时间是宝贵的:)理想情况下,您应该使代码具有足够的通用性,能够在多个DFs上工作,而无需复制粘贴。