相关疑难解决方法(0)

如何查询pandas中的MultiIndex索引列值

代码示例:

In [171]: A = np.array([1.1, 1.1, 3.3, 3.3, 5.5, 6.6])

In [172]: B = np.array([111, 222, 222, 333, 333, 777])

In [173]: C = randint(10, 99, 6)

In [174]: df = pd.DataFrame(zip(A, B, C), columns=['A', 'B', 'C'])

In [175]: df.set_index(['A', 'B'], inplace=True)

In [176]: df
Out[176]: 
          C
A   B      
1.1 111  20
    222  31
3.3 222  24
    333  65
5.5 333  22
6.6 777  74 
Run Code Online (Sandbox Code Playgroud)

现在,我想要检索A值:
Q1:在范围[3.3,6.6]中 - 预期返回值:[3.3,5.5,6.6]或[3.3,3.3,5.5,6.6],如果是最后一个,则[3.3,5.5 ]或[3.3,3.3,5.5],如果没有.
Q2:在[2.0,4.0]范围内 - 预期回报值:[3.3]或[3.3,3.3]

对于任何其他MultiIndex维度也是如此,例如B值:
Q3 …

python indexing slice multi-index pandas

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

子集化Python DataFrame

我正在从R转换到Python.我刚刚开始使用熊猫.我有一个R代码很好地子集:

k1 <- subset(data, Product = p.id & Month < mn & Year == yr, select = c(Time, Product))
Run Code Online (Sandbox Code Playgroud)

现在,我想在Python中做类似的事情.这是我到目前为止所得到的:

import pandas as pd
data = pd.read_csv("../data/monthly_prod_sales.csv")


#first, index the dataset by Product. And, get all that matches a given 'p.id' and time.
 data.set_index('Product')
 k = data.ix[[p.id, 'Time']]

# then, index this subset with Time and do more subsetting..
Run Code Online (Sandbox Code Playgroud)

我开始觉得我这样做是错误的.或许,有一个优雅的解决方案.有人可以帮忙吗?我需要从我的时间戳中提取月份和年份并进行子集化.也许有一个单行程将完成所有这些:

k1 <- subset(data, Product = p.id & Time >= start_time & Time < end_time, select = c(Time, Product))
Run Code Online (Sandbox Code Playgroud)

谢谢.

python subset pandas

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

获取一个pandas数据帧的行的索引作为整数

例如,假设一个简单的数据帧

    A         B
0   1  0.810743
1   2  0.595866
2   3  0.154888
3   4  0.472721
4   5  0.894525
5   6  0.978174
6   7  0.859449
7   8  0.541247
8   9  0.232302
9  10  0.276566
Run Code Online (Sandbox Code Playgroud)

在给定条件的情况下,如何检索行的索引值?例如: dfb = df[df['A']==5].index.values.astype(int) 返回[4],但我想得到的只是4.这导致我在代码中遇到麻烦.

基于某些条件,我想要记录满足该条件的索引,然后选择之间的行.

我试过了

dfb = df[df['A']==5].index.values.astype(int)
dfbb = df[df['A']==8].index.values.astype(int)
df.loc[dfb:dfbb,'B']
Run Code Online (Sandbox Code Playgroud)

获得所需的输出

    A         B
4   5  0.894525
5   6  0.978174
6   7  0.859449
Run Code Online (Sandbox Code Playgroud)

但我明白了 TypeError: '[4]' is an invalid key

python numpy pandas

40
推荐指数
4
解决办法
13万
查看次数

Python pandas - 在groupby之后过滤行

例如,我有以下表格:

index,A,B
0,0,0
1,0,8
2,0,8
3,1,0
4,1,5
Run Code Online (Sandbox Code Playgroud)

分组后A:

0:
index,A,B
0,0,0
1,0,8
2,0,8

1:
index,A,B
3,1,5
4,1,3
Run Code Online (Sandbox Code Playgroud)

我需要的是从每个组中删除行,其中列中的数字B小于组列中所有行的最大值B.好吧,我有一个问题,将这个问题翻译成英文,所以这里是一个例子:

B组中列的行的最大值0:8

所以我想用指数下降一行0,并保持与行的索引12

B组中列中行的最大值1:5

所以我想删除带索引的行并使用索引4保持行3

我曾尝试使用pandas过滤功能,但问题是它一次在组中的所有行上运行:

data = <example table>
grouped = data.groupby("A")
filtered = grouped.filter(lambda x: x["B"] == x["B"].max())
Run Code Online (Sandbox Code Playgroud)

所以我理想需要的是一些过滤器,它遍历组中的所有行.

感谢帮助!

PS是否还有方法只删除组中的行而不返回DataFrame对象?

python lambda group-by filter pandas

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

动态过滤pandas数据帧

我正在尝试使用三列的阈值来过滤pandas数据帧

import pandas as pd
df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
                   "B" : [2, 5, 3, 2, 6],
                   "C" : [-5, 2, 1, 8, 2]})
df = df.loc[(df.A > 0) & (df.B > 2) & (df.C > -1)].reset_index(drop = True)

df
    A  B  C
0   2  5  2
1  10  3  1
2   3  6  2
Run Code Online (Sandbox Code Playgroud)

但是,我想在一个函数中执行此操作,其中列的名称及其阈值在字典中提供给我.这是我的第一次尝试,运作正常.基本上我将过滤器放在cond变量中并运行它:

df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
                   "B" : [2, 5, 3, 2, 6],
                   "C" : …
Run Code Online (Sandbox Code Playgroud)

python exec filter dataframe pandas

20
推荐指数
2
解决办法
5867
查看次数

Pandas`isin`功能的更快替代品

我有一个非常大的数据框df,看起来像:

ID       Value1    Value2
1345      3.2      332
1355      2.2      32
2346      1.0      11
3456      8.9      322
Run Code Online (Sandbox Code Playgroud)

我有一个包含ID子集的列表ID_list.我需要的一个子集dfID包含在ID_list.

目前,我正在使用df_sub=df[df.ID.isin(ID_list)]它.但这需要很多时间.IDs中包含的ID_list没有任何模式,因此它不在一定范围内.(我需要对许多类似的数据帧应用相同的操作.我想知道是否有更快的方法来执行此操作.如果将make ID作为索引,它会有很大帮助吗?

谢谢!

python numpy pandas

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

何时使用DataFrame.eval()与pandas.eval()或python eval()

我有几十个条件(例如foo > bar),我需要在~1MM的a行上进行评估DataFrame,最简洁的写法是将这些条件存储为字符串列表并创建一个DataFrame布尔结果(每行一行)每个条件记录x一列).(评估用户输入.)

在寻求过早优化的过程中,我试图确定是否应该将这些条件写入评估范围内DataFrame(例如,df.eval("foo > bar")或者只是将其保留为python,如同eval("df.foo > df.bar")

根据增强评估性能文档:

您不应将eval()用于简单表达式或涉及小型DataFrame的表达式.事实上,对于较小的表达式/对象,eval()比普通的'Python'要快许多个数量级.一个好的经验法则是当你有一个超过10,000行的DataFrame时才使用eval().

能够使用df.eval("foo > bar")语法会很好,因为我的列表会更具可读性,但我总是找不到评估速度不慢的情况.文档显示了哪里pandas.eval()比python更快的例子eval()(符合我的经验)但没有DataFrame.eval()(因为它被列为'实验').

例如,DataFrame.eval()在一个大型的非简单表达式中仍然是一个明显的输家DataFrame:

import pandas as pd
import numpy as np
import numexpr
import timeit

someDf = pd.DataFrame({'a':np.random.uniform(size=int(1e6)), 'b':np.random.uniform(size=int(1e6))})

%timeit -n100 someDf.eval("a**b - a*b > b**a - b/a") # DataFrame.eval() on notional expression
%timeit -n100 eval("someDf['a']**someDf['b'] - someDf['a']*someDf['b'] > someDf['b']**someDf['a'] …
Run Code Online (Sandbox Code Playgroud)

python performance eval pandas

11
推荐指数
1
解决办法
3728
查看次数

如何在pandas DataFrame中存储公式而不是值

是否可以像使用Excel电子表格一样使用pandas DataFrame:例如,通过在列中输入公式,以便当其他列中的变量发生更改时,此列中的值会自动更改?就像是:

a  b  c
2  3  =a+b
Run Code Online (Sandbox Code Playgroud)

因此,当我更新2或3时,该列c也会自动更新.

PS:显然可以写一个函数来返回a+b,但是pandas或其他Python库中是否有任何内置函数可以用这种方式处理矩阵?

python pandas

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

AttributeError:'PandasExprVisitor'对象没有属性'visit_Ellipsis',使用pandas eval

我有一系列的形式:

s

0    [133, 115, 3, 1]
1    [114, 115, 2, 3]
2      [51, 59, 1, 1]
dtype: object
Run Code Online (Sandbox Code Playgroud)

请注意,其元素是字符串:

s[0]
'[133, 115, 3, 1]'
Run Code Online (Sandbox Code Playgroud)

我正在尝试pd.eval将此字符串解析为一列列表.这适用于此示例数据.

pd.eval(s)

array([[133, 115, 3, 1],
       [114, 115, 2, 3],
       [51, 59, 1, 1]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

但是,在更大的数据(10K的数量级)上,这很难失败!

len(s)
300000

pd.eval(s)
AttributeError: 'PandasExprVisitor' object has no attribute 'visit_Ellipsis'
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?功能或我的数据有问题吗?

python eval apply pandas

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

Pandas DataFrames:使用现有行中的计算来创建新行

如何通过按某些字段(在“国家”和“行业”示例中)分组并将数学应用到另一个字段(在“字段”和“值”示例中)来从现有DataFrame创建新行?

源数据帧

df = pd.DataFrame({'Country': ['USA','USA','USA','USA','USA','USA','Canada','Canada'],
                   'Industry': ['Finance', 'Finance', 'Retail', 
                                'Retail', 'Energy', 'Energy', 
                                'Retail', 'Retail'],
                   'Field': ['Import', 'Export','Import', 
                             'Export','Import', 'Export',
                             'Import', 'Export'],
                   'Value': [100, 50, 80, 10, 20, 5, 30, 10]})

    Country Industry    Field   Value
0   USA     Finance     Import  100
1   USA     Finance     Export  50
2   USA     Retail      Import  80
3   USA     Retail      Export  10
4   USA     Energy      Import  20
5   USA     Energy      Export  5
6   Canada  Retail      Import  30
7   Canada  Retail      Export  10
Run Code Online (Sandbox Code Playgroud)

目标数据框

净额=进口-出口

    Country Industry    Field …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas

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

标签 统计

pandas ×10

python ×10

dataframe ×2

eval ×2

filter ×2

numpy ×2

apply ×1

exec ×1

group-by ×1

indexing ×1

lambda ×1

multi-index ×1

performance ×1

slice ×1

subset ×1