所以我不确定以下内容本身是否有意,但这似乎是我之前使用的pandas 0.18.0的行为改变。我已经更新到0.23.0并且我得到了一些奇怪的行为......
我们假设我有一些名为dfLarge
的大型数据框,我根据某些条件从中获取了一个子集df
。 (问题的这一部分对于复制并不是真正必要的,但它来自我的实际用例以及我如何注意到熊猫行为的变化)。但事实恰恰相反,我无法在dfLarge
中找到我所寻找的条件,因此df
为空。
重要的是,df
与dtypes
共享dfLarge
。通常,对于某些df
:
In [187]: df = pd.DataFrame(columns = ['field1','field2','field3','num1','num2'])
In [188]: df['num1'] = df['num1'].astype('float64') # assume this was inherited from dfLarge
In [189]: df['num2'] = df['num2'].astype('float64') # assume this was inherited from dfLarge
In [190]: df.dtypes
Out[190]:
field1 object
field2 object
field3 object
num1 float64
num2 float64
dtype: object
现在我们为空数据帧df
提供了一些字段和不同的数据类型。我使用df.groupby
汇总我的数据,同时通过field1
和field2
之间的汇总来维护我的索引,结果数据框会更改我的字段的dtype
。
In [191]: dfGrouped = df.groupby(['field1','field2'])[['num1','num2']].sum().reset_index(level=['field1','field2'])
In [192]: dfGrouped.dtypes
Out[192]:
field1 float64
field2 float64
num1 float64
num2 float64
dtype: object
从pandas文档中可以看出,df.groupby
不应该这样做,我只发现pandas 0.18.0(dtypes
不改变)的行为改变为当我针对某些字符串测试各种TypeErrors
时,我遇到了后续的fields
。有没有办法优雅地处理这个问题,而不是在dtypes
之前将groupby
分配给新对象并以df['field'] = df['field'].astype('newtype')
方式重新应用它们?谢谢。
答案 0 :(得分:2)
指定groupby
时使用# Default Variables
newrelic = decrypt_databag('newrelic')
node.default['newrelic_npi']['license_key'] = newrelic['license_key']
plugin = 'com.newrelic.plugins.mysql.instance'
plugin_json_path = "/opt/newrelic-npi/plugins/com.newrelic.plugins.mysql.instance/newrelic_mysql_plugin-2.0.0/config/plugin.json"
node.default['newrelic_npi']['name'] = "localhost1"
execute 'fetch' do
cwd node['newrelic_npi']['install_path']
user node['newrelic_npi']['user']
command "./npi fetch #{plugin} -y"
not_if do
::File.exist? "#{node['newrelic_npi']['install_path']}/plugins/#{plugin}"
end
end
execute 'prepare' do
cwd node['newrelic_npi']['install_path']
user node['newrelic_npi']['user']
command "./npi prepare #{plugin}"
end
template "#{plugin_json_path}" do
source 'plugin.json.erb'
owner "root"
group "root"
mode "0644"
variables :name => node['newrelic_npi']['name']
action :create
end
execute 'add-service' do
cwd node['newrelic_npi']['install_path']
user node['newrelic_npi']['user']
command "sudo ./npi add-service #{plugin} --start" # needs root privileges
not_if do
::File.exist? "/etc/init.d/newrelic_plugin_#{plugin}"
end
end
。
我认为此错误是由设置和重置空template "#{plugin_json_path}" do
source 'plugin.json.erb'
owner "root"
group "root"
mode "0644"
variables :name => node['newrelic_npi']['name']
action :create
end
(as_index=False
设置MultiIndex
,然后重置它)引起的。请参阅GitHub问题跟踪器上的#19602。使用groupby
会阻止此模式发生,因为MultiIndex
首先不会被as_index=False
设置。
MultiIndex
请注意,这也应该保留非空DataFrame的行为:
groupby