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