Python 通过拆分可选的前导非字符串字符来计算新列
我是Pandas的新手,正在尝试添加两个新列,其中的值是从现有的“Result”列计算出来的 现有列包括带有可选限定符(“”)的数字 “结果”中的一些样本编号可能是:Python 通过拆分可选的前导非字符串字符来计算新列,python,pandas,calculated-columns,Python,Pandas,Calculated Columns,我是Pandas的新手,正在尝试添加两个新列,其中的值是从现有的“Result”列计算出来的 现有列包括带有可选限定符(“”)的数字 “结果”中的一些样本编号可能是: 0.5 12.67 3 <1 4.5 >10.0 这将产生错误AttributeError:“Series”对象没有属性“isdigit” (在研究了这个错误之后,我尝试了其他一些产生错误的变体 ValueError:序列的真值不明确。请使用a.empty、a.bool()、a.item()、a.any()或a.al
0.5
12.67
3
<1
4.5
>10.0
这将产生错误AttributeError:“Series”对象没有属性“isdigit”
(在研究了这个错误之后,我尝试了其他一些产生错误的变体
ValueError:序列的真值不明确。请使用a.empty、a.bool()、a.item()、a.any()或a.all()
)与以下各项一起使用:
备选方案包括:
您可以使用
df.apply
创建新列:
import pandas as pd
df = pd.DataFrame({'result': ['0.5', '12.67', '<1', '4.5', '>10.0']})
df['Result_Q'] = df['result'].apply(lambda x: x[0] if not x[0].isdigit() else None)
print(df)
result Result_Q
0 0.5 None
1 12.67 None
2 <1 <
3 4.5 None
4 >10.0 >
将熊猫作为pd导入
df=pd.DataFrame({'result':['0.5','12.67','10.0']})
df['Result_Q']=df['Result'].apply(lambda x:x[0],如果不是x[0]。isdigit()否则无)
打印(df)
结果
0.5无
1 12.67无
2 10.0 >
或尝试:
df['Result_Q'] = df['Result'].str.replace('\d+', '').str.strip('.').replace('', np.nan)
print(df)
输出:
Result Result_Q
0 0.5 NaN
1 12.67 NaN
2 3 NaN
3 <1 <
4 4.5 NaN
5 >10.0 >
结果
0.5纳米
1 12.67南
2 3南
3 10.0 >
这似乎有效。我需要更多地了解它在做什么(作为一名熊猫新手)。它将lambda函数“应用”到“result”列中的每一行。lambda函数的作用与您在“if”中所做的完全相同。@L3n95-如果需要一般解决方案,我建议不要在这里使用apply
,因为它在result
列中的NaN
s失败。如果100%确定从不包含缺少的值,则可以使用它。@jezrael是的,这是正确的,但这不是应用的直接问题,而是lambda中的If
的问题。使用np.where()
的此方法对我有效。谢谢我以前也尝试过类似的方法,但我缺少的是使用.str[0]。str
而不是。str[0]
。我现在需要回到熊猫的文档中,更好地理解这一点。
df['Result_Q'] = df.Result.str[0].str.extract('(\D)').mask(lambda x: x.isna(), None)
print (df)
Result Result_Q
0 0.5 None
1 12.67 None
2 3 None
3 <1 <
4 4.5 None
5 >10.0 >
import pandas as pd
df = pd.DataFrame({'result': ['0.5', '12.67', '<1', '4.5', '>10.0']})
df['Result_Q'] = df['result'].apply(lambda x: x[0] if not x[0].isdigit() else None)
print(df)
result Result_Q
0 0.5 None
1 12.67 None
2 <1 <
3 4.5 None
4 >10.0 >
df['Result_Q'] = df['Result'].str.replace('\d+', '').str.strip('.').replace('', np.nan)
print(df)
Result Result_Q
0 0.5 NaN
1 12.67 NaN
2 3 NaN
3 <1 <
4 4.5 NaN
5 >10.0 >