我正在使用索引大型多索引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)
所以我的问题是:导致此警告的原因是什么?我如何人为地诱发它?
关于将多索引的级别[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) 我想切片多索引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) (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 构造函数是行不通的——似乎有问题)。
谢谢。
我有一个看起来像这样的数据框:
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) 假设我有以下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) 我有一个具有列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中包含数百列。谢谢
我有以下多索引数据框:
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) pandas ×7
python ×6
multi-index ×3
dataframe ×2
aggregation ×1
apache-spark ×1
pivot-table ×1
scala ×1
slice ×1
sorting ×1