1
我有下面的代码,它只是一个函数,它接受一个输入数据帧并输出一个版本,将它们按label
进行分组并将它们相加。大熊猫想告诉我什么是警告?
import pandas as pd
import random
import numpy as np
random.seed = 10
input_data = np.array(
[
[random.randint(0,9) for x in range(4)]+['g'],
[random.randint(0,9) for x in range(4)]+['g'],
[random.randint(0,9) for x in range(4)]+['a'],
[random.randint(0,9) for x in range(4)]+['b'],
[random.randint(0,9) for x in range(4)]+['b']
]
)
input_df = pd.DataFrame(data=input_data, columns=['A','B', 'C', 'D', 'label'])
def group_and_sum(input_df):
final_df = pd.DataFrame()
for gr,subdf in input_df.groupby('label'):
new_df = pd.DataFrame()
new_df['label'] = [gr]
columns = [x for x in input_df.columns if x!='label']
subdf[columns] = subdf[columns].values.astype(float)
for col in columns:
new_df[col] = [sum(subdf[col].values)]
new_df['sum'] = sum([new_df[x].values for x in columns])
final_df = pd.concat([final_df, new_df])
final_df.index = np.array(range(len(final_df)))
return final_df
final_df = group_and_sum(input_df)
会抛出以下警告:
Warning (from warnings module):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas-0.17.0-py2.7-macosx-10.6-intel.egg/pandas/core/frame.py", line 2269
self.ix._setitem_with_indexer((slice(None), indexer), value)
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
两件事情:
1)当我检查了警告here它似乎并没有被我有关。警告中提供的链接表明我没有做任何类似chained-indexing
的链接。
2)当我试图重现功能之外的错误,我不能因为某些原因:
input_df[['A']]=input_df[['A']].astype(float)
input_df[['A','B']]=input_df[['A','B']].astype(float)
...这些都运行完美的罚款。
是否有另一种方法来重现此警告,并适用于此?谢谢。
好了,所以我猜你告诉我的是,不知何故'“subdf”'还是指或点回'input_df'?我想'groupby'对象中有一些细微差别可以做到这一点。 – Candic3
这是我能够重现警告的唯一方法:'input_df [input_df ['label'] =='g'] ['label'] = input_df ['A']'尽管如此,我仍然不清楚(这是在我的问题中) – Hunle
@Hunle:这不是说它是危险的,比'input_df [['A']] = input_df [['A']]。 “,这只是它有时较慢。另外,如果您有一系列复杂的切片操作,有时它们在分配时可能不会更新原始对象。 – BrenBarn