我正在组合熊猫数据框和ufloat,如下所示。可以工作一段时间,现在,如果我想在ufloat列上使用nsmallest函数,就会遇到问题。这是错误消息:
TypeError:列“ x”具有dtype对象,无法对此dtype使用方法“ nsmallest”
也许在数据框中放一些东西不是最好的主意。是否有结合不确定性和数据帧的更好方法?还是可以轻松解决此问题?
import numpy as np
import pandas as pd
from uncertainties import unumpy as unp
x = unp.uarray([1, 2, 3], [0.11, 0.21, 0.3])
y = unp.uarray([5, 4, 3], [0.21, 0.08, 0.23])
bar = np.array([7.2, 5.1, 3.7])
df = pd.DataFrame({ 'x':x, 'y':y, 'bar':bar })
df["z"] = df["x"]**2 + 2*df["y"]
df["zz"] = 1/df["x"] + unp.sin(df["y"])
print df.nsmallest(1, "x")
编辑:所需的输出是完整数据帧(与print df.nsmallest(1,“ bar”)相似),仅用于具有最小unumpy.nominal_values(df [“ x”])的条目。在这种情况下,它与nlargest(1,“ bar”)相同,因此
bar x y z zz
0 7.2 1.00+/-0.11 5.00+/-0.21 11.0+/-0.5 0.04+/-0.13
以下代码可能对您有帮助
import numpy as np
import pandas as pd
from uncertainties import unumpy as unp
x = unp.uarray([1, 2, 3], [0.11, 0.21, 0.3])
y = unp.uarray([5, 4, 3], [0.21, 0.08, 0.23])
bar = np.array([7.2, 5.1, 3.7])
df = pd.DataFrame({ 'x':x, 'y':y, 'bar':bar })
df["z"] = df["x"]**2 + 2*df["y"]
df["zz"] = 1/df["x"] + unp.sin(df["y"])
# print(df)
temp_smallest_nominal = df['x'].apply(lambda x : x.nominal_value).nsmallest(1)
temp_largest_nominal = df['x'].apply(lambda x : x.nominal_value).nlargest(1)
print(df.loc[df.index == temp_smallest_nominal.index[0]])
print(df.loc[df.index == temp_largest_nominal.index[0]])
temp_smallest_std_devs = df['x'].apply(lambda x : x.std_dev).nsmallest(1)
temp_largest_std_devs = df['x'].apply(lambda x : x.std_dev).nsmallest(1)
print(df.loc[df.index == temp_smallest_std_devs.index[0]])
print(df.loc[df.index == temp_largest_std_devs.index[0]])
temp_list_of_smallest = df['x'].apply(lambda x : x.nominal_value).nsmallest(2)
print(df.loc[df.index.isin(temp_list_of_smallest.index)])
temp_smallest_nominal用于过滤标称值最小的行
temp_smallest_std_devs用于过滤具有最小std_dev值的行
temp_list_of_smallest用于过滤最小值为'n'的行
对于最大值也是如此。
如果您要基于不同的过滤数据,也可以更改lambda函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句