我刚刚将我的Pandas从0.11升级到0.13.0rc1.现在,该应用程序正在弹出许多新的警告.其中一个是这样的:
E:\FinReporter\FM_EXT.py:449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
quote_df['TVol'] = quote_df['TVol']/TVOL_SCALE
Run Code Online (Sandbox Code Playgroud)
我想知道究竟是什么意思?我需要改变什么吗?
如果我坚持使用,我应该如何暂停警告quote_df['TVol'] = quote_df['TVol']/TVOL_SCALE?
def _decode_stock_quote(list_of_150_stk_str):
"""decode the webpage and return dataframe"""
from cStringIO import StringIO
str_of_all = "".join(list_of_150_stk_str)
quote_df = pd.read_csv(StringIO(str_of_all), sep=',', names=list('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg')) #dtype={'A': object, 'B': object, 'C': np.float64}
quote_df.rename(columns={'A':'STK', 'B':'TOpen', 'C':'TPCLOSE', 'D':'TPrice', 'E':'THigh', 'F':'TLow', 'I':'TVol', 'J':'TAmt', 'e':'TDate', 'f':'TTime'}, inplace=True)
quote_df = quote_df.ix[:,[0,3,2,1,4,5,8,9,30,31]]
quote_df['TClose'] = quote_df['TPrice']
quote_df['RT'] …Run Code Online (Sandbox Code Playgroud) 我对Pandas在决定数据帧中的选择是原始数据帧的副本还是原始数据的视图时使用的规则感到困惑.
如果我有,例如,
df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))
Run Code Online (Sandbox Code Playgroud)
我明白a query返回一个副本,就像这样
foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40
Run Code Online (Sandbox Code Playgroud)
对原始数据帧没有影响df.我也理解标量或命名切片返回一个视图,以便分配给这些,例如
df.iloc[3] = 70
Run Code Online (Sandbox Code Playgroud)
要么
df.ix[1,'B':'E'] = 222
Run Code Online (Sandbox Code Playgroud)
会改变df.但是当谈到更复杂的案件时,我迷失了方向.例如,
df[df.C <= df.B] = 7654321
Run Code Online (Sandbox Code Playgroud)
变化df,但是
df[df.C <= df.B].ix[:,'B':'E']
Run Code Online (Sandbox Code Playgroud)
才不是.
是否有一个简单的规则,熊猫正在使用,我只是缺少?在这些特定情况下发生了什么; 特别是,如何更改满足特定查询的数据帧中的所有值(或值的子集)(正如我在上一个示例中尝试做的那样)?
注意:这与此问题不同 ; 我已经阅读了文档,但没有得到它的启发.我还阅读了关于这个主题的"相关"问题,但我仍然缺少Pandas正在使用的简单规则,以及我如何应用它 - 例如 - 修改值(或值的子集)在满足特定查询的数据框中.
有没有一种简单的方法可以检查两个数据框是不同的副本还是不涉及操作的相同基础数据的视图?我试图抓住每一个生成的时间,并且考虑到规则似乎有多特殊,我想要一种简单的测试方法.
例如,我认为"id(df.values)"在各个视图中都是稳定的,但它们似乎不是:
# Make two data frames that are views of same data.
df = pd.DataFrame([[1,2,3,4],[5,6,7,8]], index = ['row1','row2'],
columns = ['a','b','c','d'])
df2 = df.iloc[0:2,:]
# Demonstrate they are views:
df.iloc[0,0] = 99
df2.iloc[0,0]
Out[70]: 99
# Now try and compare the id on values attribute
# Different despite being views!
id(df.values)
Out[71]: 4753564496
id(df2.values)
Out[72]: 4753603728
# And we can of course compare df and df2
df is df2
Out[73]: False
Run Code Online (Sandbox Code Playgroud)
其他答案我已经抬头试图给出规则,但似乎不一致,也不回答如何测试的问题:
当然: - http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy …
我想在Pandas中创建一个新列,使用为数据帧中的另一列切片的字符串.
例如.
Sample Value New_sample
AAB 23 A
BAB 25 B
Run Code Online (Sandbox Code Playgroud)
New_sample从一个简单的[:1]切片形成的新列在哪里Sample
我尝试过很多东西都无济于事 - 我觉得我错过了一些简单的东西.
这样做最有效的方法是什么?
说我有一个数据帧
import pandas as pd
import numpy as np
foo = pd.DataFrame(np.random.random((10,5)))
Run Code Online (Sandbox Code Playgroud)
我从我的数据子集创建另一个数据帧:
bar = foo.iloc[3:5,1:4]
Run Code Online (Sandbox Code Playgroud)
确实bar持有这些元素的副本foo?有没有办法创建view这些数据呢?如果是这样,如果我尝试修改此视图中的数据会发生什么?Pandas是否提供任何类型的写时复制机制?
我发现结果有点随机.有时它是副本有时它是一个视图.例如:
df = pd.DataFrame([{'name':'Marry', 'age':21},{'name':'John','age':24}],index=['student1','student2'])
df
age name
student1 21 Marry
student2 24 John
Run Code Online (Sandbox Code Playgroud)
现在,让我尝试稍微修改一下.
df2= df.loc['student1']
df2 [0] = 23
df
age name
student1 21 Marry
student2 24 John
Run Code Online (Sandbox Code Playgroud)
如你所见,没有任何改变.df2是一个副本.但是,如果我将另一名学生添加到数据框中...
df.loc['student3'] = ['old','Tom']
df
age name
student1 21 Marry
student2 24 John
student3 old Tom
Run Code Online (Sandbox Code Playgroud)
尝试再次改变年龄..
df3=df.loc['student1']
df3[0]=33
df
age name
student1 33 Marry
student2 24 John
student3 old Tom
Run Code Online (Sandbox Code Playgroud)
现在df3突然成了一个观点.到底是怎么回事?我想价值'旧'是关键?
我已经从R换成了熊猫.当我做类似的事情时,我经常得到SettingWithCopyWarnings
df_a = pd.DataFrame({'col1': [1,2,3,4]})
# Filtering step, which may or may not return a view
df_b = df_a[df_a['col1'] > 1]
# Add a new column to df_b
df_b['new_col'] = 2 * df_b['col1']
# SettingWithCopyWarning!!
Run Code Online (Sandbox Code Playgroud)
我想我理解这个问题,虽然我很乐意了解我的错误.在给定的示例中,未定义是否df_b是视图df_a.因此,分配的效果df_b尚不清楚:它是否会影响df_a?通过在过滤时显式制作副本可以解决此问题:
df_a = pd.DataFrame({'col1': [1,2,3,4]})
# Filtering step, definitely a copy now
df_b = df_a[df_a['col1'] > 1].copy()
# Add a new column to df_b
df_b['new_col'] = 2 * df_b['col1']
# No Warning now
Run Code Online (Sandbox Code Playgroud)
我认为有些东西是我遗漏的:如果我们真的无法确定我们是否创建了一个视图,那么哪些观点有用呢?来自pandas文档(http://pandas-docs.github.io/pandas-docs-travis/indexing.html?highlight=view#indexing-view-versus-copy)
除了简单的情况之外,很难预测它[ …
我有一个带测量值的csv文件,我想用小时平均值和标准偏差创建一个新的csv文件.但仅适用于某些列.
例:
csv1:
YY-MO-DD HH-MI-SS_SSS | Acceleration | Lumx | Pressure
2015-12-07 20:51:06:608 | 22.7 | 32.3 | 10
2015-12-07 20:51:07:609 | 22.5 | 47.7 | 15
Run Code Online (Sandbox Code Playgroud)
到csv 2(仅适用于压力和加速度:
YY-MO-DD HH-MI-SS_SSS | Acceleration avg | Pressure avg
2015-12-07 20:00:00:000 | 22.6 | 12.5
2015-12-07 21:00:00:000 | .... | ....
Run Code Online (Sandbox Code Playgroud)
现在我有一个想法(感谢本网站上的人)关于如何计算平均值 - 但我在创建一个包含几列计算的新的较小数据框时遇到了麻烦.
谢谢 !!!