相关疑难解决方法(0)

是什么原因导致Pandas中出现“索引超过lexsort深度”的警告?

我正在使用索引大型多索引Pandas df df.loc[(key1, key2)]。有时,我得到了一个系列(如预期的那样),但其他时候,我得到了一个数据框。我正在尝试隔离导致后者的情况,但是到目前为止,我所能看到的只是它与得到PerformanceWarning: indexing past lexsort depth may impact performance警告有关。

我想将其复制到此处,但无法生成另一个发出相同警告的案例。这是我的尝试:

def random_dates(start, end, n=10):
    start_u = start.value//10**9
    end_u = end.value//10**9
    return pd.to_datetime(np.random.randint(start_u, end_u, n), unit='s')

np.random.seed(0)
df = pd.DataFrame(np.random.random(3255000).reshape(465000,7))  # same shape as my data
df['date'] = random_dates(pd.to_datetime('1990-01-01'), pd.to_datetime('2018-01-01'), 465000)
df = df.set_index([0, 'date'])
df = df.sort_values(by=[3])  # unsort indices, just in case
df.index.lexsort_depth
> 0
df.index.is_monotonic
> False
df.loc[(0.9987185534991936, pd.to_datetime('2012-04-16 07:04:34'))]
# no warning
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:导致此警告的原因什么?我如何人为地诱发它?

python pandas

10
推荐指数
2
解决办法
4746
查看次数

Python Pandas通过二级索引(或任何其他级别)切片多索引

关于将多索引的级别[0]切换为级别1的范围有很多帖子.但是,我无法找到解决问题的方法; 也就是说,我需要level [0]索引值的1级索引范围

dataframe:首先是A到Z,Rank是1到400; 我需要每个级别[0](第一个)的前2个和后2个,但不是在同一个步骤中.

           Title Score
First Rank 
A     1    foo   100
      2    bar   90
      3    lime  80
      4    lame  70
B     1    foo   400
      2    lime  300
      3    lame  200
      4    dime  100
Run Code Online (Sandbox Code Playgroud)

我试图用下面的代码获取每个1级索引的最后2行,但它仅适用于第一级[0]值.

[IN]  df.ix[x.index.levels[1][-2]:]
[OUT] 
               Title Score
    First Rank 
    A     3    lime  80
          4    lame  70
    B     1    foo   400
          2    lime  300
          3    lame  200
          4    dime  100
Run Code Online (Sandbox Code Playgroud)

我通过交换索引得到的前两行,但我不能使它适用于最后两行.

df.index = df.index.swaplevel("Rank", "First")
df= df.sortlevel() #to sort by Rank …
Run Code Online (Sandbox Code Playgroud)

python sorting slice multi-index pandas

8
推荐指数
2
解决办法
7387
查看次数

pandas切片多索引数据帧

我想切片多索引pandas数据帧

这是获取我的测试数据的代码:

import pandas as pd

testdf = {
    'Name': {
        0: 'H', 1: 'H', 2: 'H', 3: 'H', 4: 'H'}, 'Division': {
            0: 'C', 1: 'C', 2: 'C', 3: 'C', 4: 'C'}, 'EmployeeId': {
                0: 14, 1: 14, 2: 14, 3: 14, 4: 14}, 'Amt1': {
                    0: 124.39, 1: 186.78, 2: 127.94, 3: 258.35000000000002, 4: 284.77999999999997}, 'Amt2': {
                        0: 30.0, 1: 30.0, 2: 30.0, 3: 30.0, 4: 60.0}, 'Employer': {
                            0: 'Z', 1: 'Z', 2: 'Z', 3: 'Z', 4: …
Run Code Online (Sandbox Code Playgroud)

python pivot-table multi-index dataframe pandas

7
推荐指数
2
解决办法
721
查看次数

pandas 中的扩展 dtypes 似乎有一个查询错误

(2/19/2019):我在 numexpr 跟踪器中打开了一个报告:https : //github.com/pydata/numexpr/issues/331

熊猫报告是:https : //github.com/pandas-dev/pandas/issues/25369

除非我正在做一些我不应该做的事情,否则可空 int 的新 dtype 扩展似乎在数据帧上的 QUERY 方法中存在错误(问题似乎出在 numexpr 包中):

df_test = pd.DataFrame(data=[4,5,6], columns=["col_test"])
df_test = df_test.astype(dtype={"col_test": pd.Int32Dtype()})
df_test.query("col_test != 6")
Run Code Online (Sandbox Code Playgroud)

长错误消息的最后几行是:

文件“...\site_packages\numexpr\necompiler.py”,第 822 行,在评估 zip(names,arguments)] 文件“...\site_packages\numexpr\necompiler.py”,第 821 行,签名 = [( name, getType(arg)) for (name, arg) in File "...\site_packages\numexpr\necompiler.py", line 703, in getType raise ValueError("unknown type %s" % a.dtype.name)值错误:未知类型对象

非扩展 dtypes 工作正常:

df_test = df_test.astype(dtype={"col_test": np.int32})
df_test.query("col_test != 6")
Run Code Online (Sandbox Code Playgroud)

(ps 作为一个完全独立的问题,将 dtype 直接传递给 pd.DataFrame 构造函数是行不通的——似乎有问题)。

谢谢。

pandas

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

使用基于索引的条件对 MultiIndex DataFrame 进行切片

我有一个看起来像这样的数据框:

import pandas as pd
import numpy as np

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']), np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
df = pd.DataFrame([[24, 13,  8,  9],
   [11, 30,  7, 23],
   [21, 31, 12, 30],
   [ 2,  5, 19, 24],
   [15, 18,  3, 16],
   [ 2, 24, 28, 11],
   [23,  9,  6, 12],
   [29, 28, 11, 21]], index=arrays, columns=list('abcd'))


df
          a   b   c   d
bar one  24  13   8   9
    two  11  30   7 …
Run Code Online (Sandbox Code Playgroud)

python pandas

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

按列“ grp”分组并压缩DataFrame-(按列“ ord”排序的每个列的最后一个非空值)

假设我有以下DataFrame:

+---+--------+---+----+----+
|grp|null_col|ord|col1|col2|
+---+--------+---+----+----+
|  1|    null|  3|null|  11|
|  2|    null|  2| xxx|  22|
|  1|    null|  1| yyy|null|
|  2|    null|  7|null|  33|
|  1|    null| 12|null|null|
|  2|    null| 19|null|  77|
|  1|    null| 10| s13|null|
|  2|    null| 11| a23|null|
+---+--------+---+----+----+
Run Code Online (Sandbox Code Playgroud)

这是带有注释的相同样本DF,按grp和排序ord

scala> df.orderBy("grp", "ord").show
+---+--------+---+----+----+
|grp|null_col|ord|col1|col2|
+---+--------+---+----+----+
|  1|    null|  1| yyy|null|
|  1|    null|  3|null|  11|   # grp:1 - last value for `col2` (11)
|  1|    null| 10| s13|null|   # …
Run Code Online (Sandbox Code Playgroud)

scala aggregate-functions aggregation apache-spark

5
推荐指数
1
解决办法
274
查看次数

多索引数据框中列之间的数学运算

我有一个具有列multiindex的数据框,需要切片并在切片之间执行数学运算。

# sample df
idx=pd.IndexSlice
np.random.seed(123)
tuples = list(zip(*[['one', 'one', 'two', 'two', 'three', 'three'],['foo', 'bar', 'foo', 'bar', 'foo', 'bar']]))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(3, 6), index=['A', 'B', 'C'], columns=index)
Run Code Online (Sandbox Code Playgroud)

如果我想在各个列之间执行加/减运算,则可以使用索引切片并按如下方式进行:

df.loc[:,idx['three','foo']] - df.loc[:,idx['two','foo']]
Run Code Online (Sandbox Code Playgroud)

但是,如果我想使用更高级别的切片,它将无法正常工作并返回NaN:

# not working
df.loc[:,idx['three',:]] - df.loc[:,idx['two',:]]
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以使用df的更高级别的切片并仅添加/减去相应的列?我的数据框可能在multiindex中包含数百列。谢谢

python dataframe pandas

4
推荐指数
1
解决办法
175
查看次数

Pandas Multiindex 从索引的第一个条目获取值

我有以下多索引数据框:

from io import StringIO
import pandas as pd
datastring = StringIO("""File,no,runtime,value1,value2
    A,0, 0,12,34
    A,0, 1,13,34
    A,0, 2,23,34
    A,1, 6,23,38
    A,1, 7,22,38
    B,0,17,15,35
    B,0,18,17,35
    C,0,34,23,32
    C,0,35,21,32
    """)    
df = pd.read_csv(datastring, sep=',')
df.set_index(['File','no',df.index], inplace=True)


>> df
               runtime  value1  value2
File   no               
A      0    0     0       12      34
            1     1       13      34
            2     2       23      34
       1    3     6       23      38
            4     7       22      38
B      0    5     17      15      35
            6     18      17      35
C      0    7     34      23      32
            8 …
Run Code Online (Sandbox Code Playgroud)

python multi-index pandas

2
推荐指数
1
解决办法
1689
查看次数