Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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 为什么lambda操作不起作用?_Python_Pandas_Lambda - Fatal编程技术网

Python 为什么lambda操作不起作用?

Python 为什么lambda操作不起作用?,python,pandas,lambda,Python,Pandas,Lambda,我想在我的数据框中取任何显示为“小于”的值,并将它们报告为小于值一半的数字 e、 g.您的代码无法处理非字符串(如整数或浮点),因为您无法在不将它们转换为字符串的情况下对它们进行索引。您可以显式地将所有内容转换为字符串并执行索引 在执行lambda操作之前,还需要检查空字符串 #Explicitly cast to string and perform the indexing func = lambda x: x if str(x)[0]!='<' else float(str(x)[

我想在我的数据框中取任何显示为“小于”的值,并将它们报告为小于值一半的数字


e、 g.您的代码无法处理非字符串(如整数或浮点),因为您无法在不将它们转换为字符串的情况下对它们进行索引。您可以显式地将所有内容转换为字符串并执行索引

在执行lambda操作之前,还需要检查空字符串

#Explicitly cast to string and perform the indexing
func = lambda x: x if  str(x)[0]!='<' else float(str(x)[1:])/2

li = ['<1', '<0.5', '<5', 1, 'hello', 4.0, '']

#Filter out empty strings
print([func(item) for item in li if item])

您的代码无法处理非字符串(如整数或浮点),因为您无法在不将它们转换为字符串的情况下对它们进行索引。您可以显式地将所有内容转换为字符串并执行索引

在执行lambda操作之前,还需要检查空字符串

#Explicitly cast to string and perform the indexing
func = lambda x: x if  str(x)[0]!='<' else float(str(x)[1:])/2

li = ['<1', '<0.5', '<5', 1, 'hello', 4.0, '']

#Filter out empty strings
print([func(item) for item in li if item])
应用的方法有一个轴参数。默认情况下,axis=0,这意味着lambda函数将依次应用于数据帧中的每一列。在您的例子中,lambda函数应用于列“Cu”,这意味着参数x实际上是一列,而strx[0]不是您所认为的

您应该使用applymap,以便按元素应用lambda函数:

df.applymap(lambda x: x if str(x)[0] != '<' else float(str(x)[1:])/2)
应用的方法有一个轴参数。默认情况下,axis=0,这意味着lambda函数将依次应用于数据帧中的每一列。在您的例子中,lambda函数应用于列“Cu”,这意味着参数x实际上是一列,而strx[0]不是您所认为的

您应该使用applymap,以便按元素应用lambda函数:

df.applymap(lambda x: x if str(x)[0] != '<' else float(str(x)[1:])/2)

我认为您只需要对Cu列应用lambda函数,所以正确的解决方案是使用:


如果需要为所有列应用函数,请使用解决方案。

我认为您只需要为Cu列应用lambda函数,所以正确的解决方案是使用:


如果需要为所有列应用函数,请使用解决方案。

在您的问题中,您可以这样说


e、 在你的问题中你说

e、 g.以下是它的工作原理:

import pandas as pd

df=pd.DataFrame()
df['Cu']=[3.7612,1.3693, 2.7502,1.407,4.2066,6.4409,6.8136,"<0.05","<0.05",0.94,0.07,1.82,2.63,1.36,0.78]

df['Cu'] = df.apply(lambda x: x if not isinstance(x[0],str) else float(x[0][1:])/2, axis=1, raw=True)

print(df)
以下是它的工作原理:

import pandas as pd

df=pd.DataFrame()
df['Cu']=[3.7612,1.3693, 2.7502,1.407,4.2066,6.4409,6.8136,"<0.05","<0.05",0.94,0.07,1.82,2.63,1.36,0.78]

df['Cu'] = df.apply(lambda x: x if not isinstance(x[0],str) else float(x[0][1:])/2, axis=1, raw=True)

print(df)

我将此lambda应用于一个裸列表li=['测试并运行良好…df=pd.Series['显示一些失败的示例输入。以及失败的输出。@ruohola按要求完成这似乎是一个可怕的数据帧布局,在一列中混合字符串和浮点数…我将此lambda应用于一个裸列表li=['测试并运行良好…df=pd.Series['显示一些失败的示例输入。以及失败的输出。@ruohola按要求完成这看起来像是一个可怕的数据帧布局,在一列中混合字符串和浮点数…这不是一个可伸缩的解决方案。我的实际数据集是35K行和150列。手动计算每次发生的检测限的一半是不可行的ce。当数据按原样提供以供处理时,就不会出现不良风格。我的问题是如何转换这些数据。你的反馈就像是停下来指点方向,然后被告知我不会从这里开始。但是感谢19.7k代表的否决票。什么?我从来没有否决过任何东西。我完全接受你必须dea我的答案很简单:你应该做这个额外的步骤,这样你的数据在将来会变得更有用,更容易使用。我提供的代码是完全矢量化的,很可能是所有答案中性能最好的,而你有150列这一事实只是另一个技术问题,但与w无关就解决方案本身而言。可能我误解了你的问题。我的印象是你想保留str/float混合列的数据类型。这不是一个可伸缩的解决方案。我的实际数据集是35K行150列。手动计算每次出现的检测限值的一半是不可行的。我没有坏的风格我的问题是如何转换这些数据。你的反馈就像是停下来指点方向,然后被告知我不会从这里开始。但是感谢19.7k代表的否决票。什么?我从来没有否决过任何东西。我完全接受你必须处理异构数据。M答案很简单:你应该做这个额外的步骤,这样你的数据在将来会变得更有用,更容易使用。我提供的代码是完全矢量化的,很可能是所有答案中性能最好的。事实上,你有150列只是另一个技术问题,但与解决方案本身无关。Mayb我只是误解了你的问题。我的印象是你想保留str/float混合列的数据类型。
import pandas as pd

df=pd.DataFrame()
df['Cu']=[3.7612,1.3693, 2.7502,1.407,4.2066,6.4409,6.8136,"<0.05","<0.05",0.94,0.07,1.82,2.63,1.36,0.78]

df['less_than'] = df['Cu'].str.startswith('<', False)
df.loc[df['less_than'], 'Cu'] = df.loc[df['less_than'], 'Cu'].str.slice(1)

df['Cu'] = df['Cu'].astype(float)
#         Cu  less_than
# 0   3.7612      False
# 1   1.3693      False
# 2   2.7502      False
# 3   1.4070      False
# 4   4.2066      False
# 5   6.4409      False
# 6   6.8136      False
# 7   0.0500       True
# 8   0.0500       True
# 9   0.9400      False
# 10  0.0700      False
# 11  1.8200      False
# 12  2.6300      False
# 13  1.3600      False
# 14  0.7800      False
df.loc[df['less_than'], 'Cu'] /= 2
import pandas as pd

df=pd.DataFrame()
df['Cu']=[3.7612,1.3693, 2.7502,1.407,4.2066,6.4409,6.8136,"<0.05","<0.05",0.94,0.07,1.82,2.63,1.36,0.78]

df['Cu'] = df.apply(lambda x: x if not isinstance(x[0],str) else float(x[0][1:])/2, axis=1, raw=True)

print(df)
        Cu
0   3.7612
1   1.3693
2   2.7502
3    1.407
4   4.2066
5   6.4409
6   6.8136
7    0.025
8    0.025
9     0.94
10    0.07
11    1.82
12    2.63
13    1.36
14    0.78