代码示例:
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 …
我正在从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)
谢谢.
例如,假设一个简单的数据帧
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
例如,我有以下表格:
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,并保持与行的索引1和2
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对象?
我正在尝试使用三列的阈值来过滤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) 我有一个非常大的数据框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.我需要的一个子集df为ID包含在ID_list.
目前,我正在使用df_sub=df[df.ID.isin(ID_list)]它.但这需要很多时间.IDs中包含的ID_list没有任何模式,因此它不在一定范围内.(我需要对许多类似的数据帧应用相同的操作.我想知道是否有更快的方法来执行此操作.如果将make ID作为索引,它会有很大帮助吗?
谢谢!
我有几十个条件(例如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) 是否可以像使用Excel电子表格一样使用pandas DataFrame:例如,通过在列中输入公式,以便当其他列中的变量发生更改时,此列中的值会自动更改?就像是:
a b c
2 3 =a+b
Run Code Online (Sandbox Code Playgroud)
因此,当我更新2或3时,该列c也会自动更新.
PS:显然可以写一个函数来返回a+b,但是pandas或其他Python库中是否有任何内置函数可以用这种方式处理矩阵?
我有一系列的形式:
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)
我在这里错过了什么?功能或我的数据有问题吗?
如何通过按某些字段(在“国家”和“行业”示例中)分组并将数学应用到另一个字段(在“字段”和“值”示例中)来从现有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)