尝试使用 locale.atof() 更改数据帧中的小数周期以使用 pivot_tables 进行转换
Trying to use locale.atof() for changing the period in decimals within a dataframe to convert using pivot_tables
假设我有一个如下所示的数据框。 Value
列中的值是小数。
df.head()
ID Key Value
0 A0AVT1 MAHA 4842000
1 A0FGR8 MAHA 3522710
2 A0JLT2 MAHA 283,433
3 A0JNW5 MAHA 356,09677
4 A0MZ66 CEB 37,5
5 A0PJW6 CEB 487,03677
6 A1AG CEB 10,625567
7 A1L0T0 HAC 12
8 A1L390 HAC 63,946
9 A1X283 HAC 138,25
我想使用 pandas pivot_tables
来转换上面的数据框,方法是使用 ID
作为索引,使用 Key
作为列值来自列 Value
。所以我尝试了以下一种衬垫:
df2.reset_index().pivot_table(values='Value',index='ID',columns='Key')
但是,上面的一个衬里抛出了这个数据错误:
~/software/anaconda/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in _cython_agg_blocks(self, how, alt, numeric_only, min_count)
4042
4043 if len(new_blocks) == 0:
-> 4044 raise DataError('No numeric types to aggregate')
4045
4046 # reset the locs in the blocks to correspond to our
DataError: No numeric types to aggregate
此外,我尝试使用模块 locale
转换数据框 df
中 Value
列中的 ,
。这是我尝试过的:
import locale
locale.setlocale(locale.LC_ALL, 'de_DE') #Germany
df.Value.astype(str).apply(locale.atof)
它抛出错误:
TypeError: data type not understood
我试过使用 astype (float)。它没有改变任何东西。
任何 help/suggestions 非常感谢!
谢谢。
正确设置locale的通用方法是让系统从环境中找到:
locale.setlocale(locale.LC_NUMERIC, '')
这在我的机器上产生:
>>> locale.setlocale(locale.LC_NUMERIC, '')
'de_DE.UTF-8'
>>> df.Value.apply(locale.atof)
0 4.842000e+06
1 3.522710e+06
2 2.834330e+02
3 3.560968e+02
4 3.750000e+01
5 4.870368e+02
6 1.062557e+01
7 1.200000e+01
8 6.394600e+01
9 1.382500e+02
如果您想明确设置语言环境,则必须为 Linux 和 Windows 使用不同的语言环境字符串:
Linux:
locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF8') # or 'de_DE.UTF-8'
Windows:
locale.setlocale(locale.LC_NUMERIC, 'German') # or 'de' or 'deu' (case insensitive)
假设我有一个如下所示的数据框。 Value
列中的值是小数。
df.head()
ID Key Value
0 A0AVT1 MAHA 4842000
1 A0FGR8 MAHA 3522710
2 A0JLT2 MAHA 283,433
3 A0JNW5 MAHA 356,09677
4 A0MZ66 CEB 37,5
5 A0PJW6 CEB 487,03677
6 A1AG CEB 10,625567
7 A1L0T0 HAC 12
8 A1L390 HAC 63,946
9 A1X283 HAC 138,25
我想使用 pandas pivot_tables
来转换上面的数据框,方法是使用 ID
作为索引,使用 Key
作为列值来自列 Value
。所以我尝试了以下一种衬垫:
df2.reset_index().pivot_table(values='Value',index='ID',columns='Key')
但是,上面的一个衬里抛出了这个数据错误:
~/software/anaconda/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in _cython_agg_blocks(self, how, alt, numeric_only, min_count)
4042
4043 if len(new_blocks) == 0:
-> 4044 raise DataError('No numeric types to aggregate')
4045
4046 # reset the locs in the blocks to correspond to our
DataError: No numeric types to aggregate
此外,我尝试使用模块 locale
转换数据框 df
中 Value
列中的 ,
。这是我尝试过的:
import locale
locale.setlocale(locale.LC_ALL, 'de_DE') #Germany
df.Value.astype(str).apply(locale.atof)
它抛出错误:
TypeError: data type not understood
我试过使用 astype (float)。它没有改变任何东西。
任何 help/suggestions 非常感谢! 谢谢。
正确设置locale的通用方法是让系统从环境中找到:
locale.setlocale(locale.LC_NUMERIC, '')
这在我的机器上产生:
>>> locale.setlocale(locale.LC_NUMERIC, '')
'de_DE.UTF-8'
>>> df.Value.apply(locale.atof)
0 4.842000e+06
1 3.522710e+06
2 2.834330e+02
3 3.560968e+02
4 3.750000e+01
5 4.870368e+02
6 1.062557e+01
7 1.200000e+01
8 6.394600e+01
9 1.382500e+02
如果您想明确设置语言环境,则必须为 Linux 和 Windows 使用不同的语言环境字符串:
Linux:
locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF8') # or 'de_DE.UTF-8'
Windows:
locale.setlocale(locale.LC_NUMERIC, 'German') # or 'de' or 'deu' (case insensitive)