我想出了这两种方法.还有更好的吗?
>>> import pandas as pd
>>> df = pd.DataFrame({'A': [5, 6, 7], 'B': [7, 8, 9]})
>>> print df.sum().sum()
42
>>> print df.values.sum()
42
Run Code Online (Sandbox Code Playgroud)
只是想确保我没有遗漏更明显的东西.
我在这里和那里回答几个问题.我经常测试我和其他人的解决方案有多快.
是否有一个简单的框架来全面了解各种解决方案的速度有多快?
考虑数据帧 df
df = pd.DataFrame({
'Group': list('QLCKPXNLNTIXAWYMWACA'),
'Value': [29, 52, 71, 51, 45, 76, 68, 60, 92, 95,
99, 27, 77, 54, 39, 23, 84, 37, 99, 87]
})
Run Code Online (Sandbox Code Playgroud)
我想总结Value按不同值分组的列Group.我有三种方法可以做到这一点.
import pandas as pd
import numpy as np
from numba import njit
def sum_pd(df):
return df.groupby('Group').Value.sum()
def sum_fc(df):
f, u = pd.factorize(df.Group.values)
v = df.Value.values
return pd.Series(np.bincount(f, weights=v).astype(int), pd.Index(u, name='Group'), name='Value').sort_index()
@njit
def wbcnt(b, w, k):
bins = np.arange(k)
bins = …Run Code Online (Sandbox Code Playgroud) 我遇到了大熊猫加入的问题,我正在试图找出问题所在.说我有一个dataframex:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1941 entries, 2004-10-19 00:00:00 to 2012-07-23 00:00:00
Data columns:
close 1941 non-null values
high 1941 non-null values
low 1941 non-null values
open 1941 non-null values
dtypes: float64(4)
Run Code Online (Sandbox Code Playgroud)
我应该能够使用简单的连接命令将其与y连接在一起,其中y = x除了colnames有+2.
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1941 entries, 2004-10-19 00:00:00 to 2012-07-23 00:00:00
Data columns:
close2 1941 non-null values
high2 1941 non-null values
low2 1941 non-null values
open2 1941 non-null values
dtypes: float64(4)
y.join(x) or pandas.DataFrame.join(y,x):
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 34879 entries, 2004-12-16 00:00:00 to 2012-07-12 00:00:00
Data …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种有效的方法,将一个系列转换为其索引的元组及其值.
s = pd.Series([1, 2, 3], ['a', 'b', 'c'])
Run Code Online (Sandbox Code Playgroud)
我想要一个数组,列表,系列,一些可迭代:
[(1, 'a'), (2, 'b'), (3, 'c')]
Run Code Online (Sandbox Code Playgroud) 我经常使用范围条件将pandas用于合并(join).
例如,如果有2个数据帧:
A(A_id,A_value)
B(B_id,B_low,B_high,B_name)
它们很大并且大小相同(比如每个2M记录).
我想在A和B之间建立一个内连接,所以A_value将在B_low和B_high之间.
使用SQL语法:
SELECT *
FROM A,B
WHERE A_value between B_low and B_high
Run Code Online (Sandbox Code Playgroud)
这将非常简单,简短而有效.
同时在pandas中唯一的方法(不使用我发现的循环)是在两个表中创建一个虚拟列,连接它(相当于交叉连接),然后过滤掉不需要的行.这听起来沉重而复杂:
A['dummy'] = 1
B['dummy'] = 1
Temp = pd.merge(A,B,on='dummy')
Result = Temp[Temp.A_value.between(Temp.B_low,Temp.B_high)]
Run Code Online (Sandbox Code Playgroud)
我的另一个解决方案是通过使用B[(x>=B.B_low) & (x<=B.B_high)]掩码在B上的每个A值上应用搜索函数,但它听起来效率低,并且可能需要索引优化.
是否有更优雅和/或更有效的方式来执行此操作?
我使用Enthought的python发行版作为研究生进行数据分析,并且非常喜欢它.但我最近接受了一项工作,这剥夺了我使用它的能力.
我更喜欢Python用于初始范围和清理数据,而R用于统计数据.想要这个的一部分动力就是尝试大熊猫.而其他部分是我没有适当的许可证(或支付手段),这显然是一个问题.
那么,有没有其他的一些好放在一起容易安装Python发行,我可以得到numpy,scipy,sci-kits,和所有其他的善良?
我想我不是白痴,但也许我错了.任何人都可以向我解释为什么这不起作用?我可以使用'merge'来达到预期的效果.但我最终需要加入多个,pandas DataFrames所以我需要让这个方法起作用.
In [2]: left = pandas.DataFrame({'ST_NAME': ['Oregon', 'Nebraska'], 'value': [4.685, 2.491]})
In [3]: right = pandas.DataFrame({'ST_NAME': ['Oregon', 'Nebraska'], 'value2': [6.218, 0.001]})
In [4]: left.join(right, on='ST_NAME', lsuffix='_left', rsuffix='_right')
Out[4]:
ST_NAME_left value ST_NAME_right value2
0 Oregon 4.685 NaN NaN
1 Nebraska 2.491 NaN NaN
Run Code Online (Sandbox Code Playgroud) 我正在尝试一次更新几个字段 - 我有两个数据源,我正在尝试协调它们.我知道我可以做一些丑陋的合并,然后删除列,但希望下面的代码工作:
df = pd.DataFrame([['A','B','C',np.nan,np.nan,np.nan],
['D','E','F',np.nan,np.nan,np.nan],[np.nan,np.nan,np.nan,'a','b','d'],
[np.nan,np.nan,np.nan,'d','e','f']], columns = ['Col1','Col2','Col3','col1_v2','col2_v2','col3_v2'])
print df
Col1 Col2 Col3 col1_v2 col2_v2 col3_v2
0 A B C NaN NaN NaN
1 D E F NaN NaN NaN
2 NaN NaN NaN a b d
3 NaN NaN NaN d e f
#update
df.loc[df['Col1'].isnull(),['Col1','Col2', 'Col3']] = df[['col1_v2','col2_v2','col3_v2']]
print df
Col1 Col2 Col3 col1_v2 col2_v2 col3_v2
0 A B C NaN NaN NaN
1 D E F NaN NaN NaN
2 NaN NaN NaN a b …Run Code Online (Sandbox Code Playgroud) 您可以使用这些方法计算偏斜和峰度
但是,没有方便的方法来计算变量之间的歪斜或彗星密度.甚至更好,歪斜或cokurtosis矩阵.
考虑一下 pd.DataFrame df
import pandas as pd
import numpy as np
np.random.seed([3,1415])
df = pd.DataFrame(np.random.rand(10, 2), columns=list('ab'))
df
a b
0 0.444939 0.407554
1 0.460148 0.465239
2 0.462691 0.016545
3 0.850445 0.817744
4 0.777962 0.757983
5 0.934829 0.831104
6 0.879891 0.926879
7 0.721535 0.117642
8 0.145906 0.199844
9 0.437564 0.100702
Run Code Online (Sandbox Code Playgroud)
a和b?我继承了以Stata .dta格式保存的数据文件.我可以用scikits.statsmodels genfromdta()函数加载它.这将我的数据放入一维NumPy数组中,其中每个条目都是一行数据,存储在24元组中.
In [2]: st_time = time.time(); initialload = sm.iolib.genfromdta("/home/myfile.dta"); ed_time = time.time(); print (ed_time - st_time)
666.523324013
In [3]: type(initialload)
Out[3]: numpy.ndarray
In [4]: initialload.shape
Out[4]: (4809584,)
In [5]: initialload[0]
Out[5]: (19901130.0, 289.0, 1990.0, 12.0, 19901231.0, 18.0, 40301000.0, 'GB', 18242.0, -2.368063, 1.0, 1.7783716290878204, 4379.355, 66.17669677734375, -999.0, -999.0, -0.60000002, -999.0, -999.0, -999.0, -999.0, -999.0, 0.2, 371.0)
Run Code Online (Sandbox Code Playgroud)
我很好奇是否有一种有效的方法将其安排到Pandas DataFrame中.根据我的阅读,逐行构建DataFrame看起来效率很低......但我的选择是什么?
我写了一个非常慢的第一遍,它只是将每个元组作为单行DataFrame读取并附加它.只是想知道是否还有其他更好的东西.