相关疑难解决方法(0)

如何在Pandas中处理SettingWithCopyWarning?

背景

我刚刚将我的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)

python dataframe pandas chained-assignment

536
推荐指数
16
解决办法
58万
查看次数

根据列值删除Pandas中的DataFrame行

我有以下DataFrame:

             daysago  line_race rating        rw    wrating
 line_date                                                 
 2007-03-31       62         11     56  1.000000  56.000000
 2007-03-10       83         11     67  1.000000  67.000000
 2007-02-10      111          9     66  1.000000  66.000000
 2007-01-13      139         10     83  0.880678  73.096278
 2006-12-23      160         10     88  0.793033  69.786942
 2006-11-09      204          9     52  0.636655  33.106077
 2006-10-22      222          8     66  0.581946  38.408408
 2006-09-29      245          9     70  0.518825  36.317752
 2006-09-16      258         11     68  0.486226  33.063381
 2006-08-30      275          8     72  0.446667  32.160051
 2006-02-11      475          5     65  0.164591  10.698423
 2006-01-13      504          0     70  0.142409   9.968634
 2006-01-02 …
Run Code Online (Sandbox Code Playgroud)

python pandas

441
推荐指数
12
解决办法
67万
查看次数

创建一个空的Pandas DataFrame,然后填充它?

我从这里的pandas DataFrame文档开始:http://pandas.pydata.org/pandas-docs/stable/dsintro.html

我想迭代地使用时间序列计算中的值填充DataFrame.基本上,我想用列A,B和时间戳行初始化DataFrame,全部为0或全部为NaN.

然后,我会添加初始值并检查此数据,计算前一行中的新行,row[A][t] = row[A][t-1]+1或者说左右.

我目前正在使用下面的代码,但我觉得它有点难看,必须有一种方法可以直接使用DataFrame,或者只是更好的方式.注意:我使用的是Python 2.7.

import datetime as dt
import pandas as pd
import scipy as s

if __name__ == '__main__':
    base = dt.datetime.today().date()
    dates = [ base - dt.timedelta(days=x) for x in range(0,10) ]
    dates.sort()

    valdict = {}
    symbols = ['A','B', 'C']
    for symb in symbols:
        valdict[symb] = pd.Series( s.zeros( len(dates)), dates )

    for thedate in dates:
        if thedate > dates[0]:
            for symb in valdict:
                valdict[symb][thedate] = 1+valdict[symb][thedate - dt.timedelta(days=1)]

    print valdict
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas

381
推荐指数
4
解决办法
105万
查看次数

如何从一列中对pandas数据帧进行排序

我有一个这样的数据框:

print(df)

        0          1     2
0   354.7      April   4.0
1    55.4     August   8.0
2   176.5   December  12.0
3    95.5   February   2.0
4    85.6    January   1.0
5     152       July   7.0
6   238.7       June   6.0
7   104.8      March   3.0
8   283.5        May   5.0
9   278.8   November  11.0
10  249.6    October  10.0
11  212.7  September   9.0
Run Code Online (Sandbox Code Playgroud)

如您所见,月份不是日历顺序.所以我创建了第二列,以获得与每个月相对应的月份数(1-12).从那里,我如何根据日历月的顺序对此数据框进行排序?

python sorting pandas

178
推荐指数
11
解决办法
24万
查看次数

为什么 Pandas 操作没有到位?

Pandas 操作通常会创建原始数据帧的副本。正如 SO 上的一些答案指出的那样,即使在使用时inplace=True,许多操作仍然会创建一个副本来进行操作。

现在,如果我告诉我的同事,每次我想要申请+2一个列表时,我都会在做之前复制整个内容,我想我会被称为疯子。然而,这就是 Pandas 所做的。即使是简单的操作(例如追加)也会重新分配整个数据帧

必须在每个操作中重新分配和复制所有内容似乎是对任何数据进行操作的非常低效的方法。它还使得无法对特别大的数据帧进行操作,即使它们适合您的 RAM。

此外,这对于 Pandas 开发者或用户来说似乎不是问题,以至于有一个开放的问题 #16529 讨论完全删除该inplace参数,该问题得到了大部分积极的回应;有些从 1.0 开始就被弃用了。好像我错过了一些东西。那么,我错过了什么?

始终在操作上复制数据帧而不是尽可能就地执行它们有什么优点?

注意:我同意方法链接非常简洁,我一直使用它。然而,我觉得“因为我们可以方法链”并不是完整的答案,因为 Pandas 有时甚至在inplace=True方法中进行复制,而这些方法并不意味着被链接。因此,我正在寻找其他一些答案来了解为什么这是一个合理的默认值。

python in-place pandas

34
推荐指数
1
解决办法
2413
查看次数

熊猫 - 就位=真正被认为有害或无效?

这已在前面讨论过,但答案相互矛盾:

我想知道的是:

  • 为什么是inplace = False默认行为?
  • 什么时候改变呢?(好吧,我被允许改变它,所以我猜这是有原因的).
  • 这是安全问题吗?也就是说,操作失败/行为失误是由于inplace = True
  • 我是否可以提前知道某项inplace = True操作是否"真正"就地进行?

我到目前为止:

  • 许多Pandas操作都有一个inplace参数,总是默认为False,意味着原始的DataFrame不受影响,并且操作返回一个新的DF.
  • 设置时inplace = True,操作可能适用于原始DF,但它可能仍在幕后复制,只需在完成后重新分配参考.

专业人士inplace = False:

  • 允许链接/功能语法:df.dropna().rename().sum()...这很好,并提供延迟评估或更有效的重新排序的机会(虽然我不认为Pandas正在这样做).
  • inplace = True在可能是底层DF的切片/视图的对象上使用时,Pandas必须进行SettingWithCopy检查,这是昂贵的.inplace = False避免这种情况.
  • 幕后一致且可预测的行为.

专业人士inplace = True:

  • 可以更快,更少内存占用(第一个链接显示reset_index()运行速度快两倍,并使用峰值内存的一半!).

因此,inplace = True除了专门编写链式语句之外,将copy-vs-view问题放在一边,总是使用它似乎更高效.但这不是默认的熊猫选择,所以我错过了什么?

python pandas

27
推荐指数
2
解决办法
7444
查看次数

熊猫替换不起作用的元素

我已经查到了这个问题,大多数问题都是针对更复杂的替代品.但是在我的情况下,我有一个非常简单的数据帧作为测试假人.

目的是用nan替换数据框中任何位置的字符串,但这似乎不起作用(即不替换;没有任何错误).我已经尝试用另一个字符串替换它也不起作用.例如

d = {'color' : pd.Series(['white', 'blue', 'orange']),
   'second_color': pd.Series(['white', 'black', 'blue']),
   'value' : pd.Series([1., 2., 3.])}
df = pd.DataFrame(d)
df.replace('white', np.nan)
Run Code Online (Sandbox Code Playgroud)

输出仍然是:

      color second_color  value
  0   white        white      1
  1    blue        black      2
  2  orange         blue      3
Run Code Online (Sandbox Code Playgroud)

python replace numpy pandas

11
推荐指数
5
解决办法
2万
查看次数

Pandas DataFrame 切片与副本:哪一个对内存更友好?

我发誓我前段时间在某处看到过这个讨论,但我再也找不到这个了。

想象一下我有这个方法:

def my_method():
    df = pd.DataFrame({'val': np.random.randint(0, 1000, 1000000)})
    return df[df['val'] == 1]
Run Code Online (Sandbox Code Playgroud)

自从我决定不这样做以来已经有一段时间了,因为该方法可能会返回一个视图(这不是确定的,取决于 pandas 想要做什么)而不是一个新的数据帧。

我读到的问题是,如果返回一个视图,原始数据帧中的引用计数不会减少,因为即使我们只使用了一小部分数据,它仍在引用旧数据帧。

我被建议改为执行以下操作:

def my_method():
    df = pd.DataFrame({'val': np.random.randint(0, 1000, 1000000)})
    return df.drop(df[df["val"] != 1].index)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,drop 方法仅使用我们想要保留的数据创建一个新的数据帧,一旦该方法完成,原始数据帧中的引用计数将被设置为零,使其容易受到垃圾收集并最终释放内存。

总而言之,这将更加内存友好,并且还将确保该方法的结果是一个数据帧,而不是一个数据帧的视图,这会导致settingOnCopyWarning我们都喜欢。

这仍然是真的吗?或者是我在某处误读了什么?我试图检查这是否对内存使用有一些好处,但考虑到我无法控制 gc 何时决定从内存中“删除”东西,只是要求它收集东西......我似乎从来没有任何结论性的结果。

python dataframe pandas

10
推荐指数
1
解决办法
187
查看次数

8
推荐指数
3
解决办法
3万
查看次数

astype 熊猫上的错误?

我正在使用 timedeltas,似乎这段代码

copy_for_U.Time.astype('timedelta64[m]',copy=False);

不会更改数据框 - 如果我从文档中正确理解,它应该如此,它说:

Signature: full_df.Time.astype(dtype, copy=True, raise_on_error=True, **kwargs) Docstring: Cast object to input numpy.dtype Return a copy when copy = True (be really careful with this!)

python numpy timedelta pandas

6
推荐指数
1
解决办法
636
查看次数