Python pandas добавление точности с помощью лямбды - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь найти точность поля данных, используя следующий код

fieldStructure.loc[fieldName,'Precision'] = df[fieldName].apply(lambda x: len(str.split(str(x), ".")[1])).max()

, однако он возвращает огромное число (18).при расследовании вижу следующее поведение.Я понимаю, что это связано с тем, как хранятся числа с плавающей запятой.Однако есть ли способ получить желаемый результат без потери точности моих исходных данных?

Мой фрейм данных такой, как показано ниже.

print('Sample Data: ',df[fieldName])

Sample Data:  0     0.0111
1     0.0109
2     0.0097
3     0.0113
4     0.0088
5     0.0101
6     0.0108
7     0.0113
8     0.0119
9     0.0090
10    0.0069
11    0.0585
12    0.0031
13    0.0205
14    0.0066
15    0.0081
16    0.0016
17    0.0122
18    0.0088
19    0.0132
20    0.0051
21    0.0032
22    0.0104
23    0.0097
24    0.0137
25    0.0142
26    0.0087
27    0.0106

Однако, когда я пытаюсь распечатать то же самое, используяЛямбда я получаю следующие результаты

df[fieldName].apply(lambda x: print(x))
Name: MyColumn, dtype: float64
0.0111
0.0109
0.0097
0.0113
0.0088
0.0101
0.0108
0.0113
0.0119
0.009000000000000001
0.0069
0.0585
0.0031
0.0205
0.0066
0.0081
0.0016
0.0122
0.0088
0.0132
0.0051
0.0032
0.0104
0.0097
0.0137
0.0142
0.0087
0.0106

Я пытался повторить поведение с помощью оболочки, но здесь, похоже, работает как ожидалось.

>>> df = pd.Series([0.0111,0.0109,0.0097,0.0113,0.0088,0.0101,0.0108,0.0113,0.0119,0.0090])
>>> df.apply(lambda x: print(x))
0.0111
0.0109
0.0097
0.0113
0.0088
0.0101
0.0108
0.0113
0.0119
0.009
0    None
1    None
2    None
3    None
4    None
5    None
6    None
7    None
8    None
9    None
dtype: object

Как избавиться от дополнительной точностив df [fieldName] .apply (лямбда-x: print (x)) (0,009000000000000001 из 0,0090)?

1 Ответ

0 голосов
/ 25 марта 2019

Проблема возникает случайно при попытке выполнить любые итерации на основе строк в наборе данных.Я смог получить то же поведение, используя .iterrows (), а также.

Однако, когда я использовал float_precision = 'high' в качестве параметра для read_csv, я увидел бы гораздо более ожидаемое поведение при использовании лямбда-выражения или iterrows.

df = pd.read_fwf(currentFile, parse_dates=False, skiprows=HeaderPos, skipfooter=0,  widths=width, header=forceHeader, float_precision= 'high')
...