LEFT| RIGHT| FULL)(INNER| OUTER)连接?merge?join?concat?update?谁?什么?为什么?!... 和更多.我已经看到了这些反复出现的问题,询问了pandas合并功能的各个方面.今天关于合并及其各种用例的大部分信息在几十个措辞严厉,不可搜索的帖子中都是分散的.这里的目的是为后代整理一些更重要的观点.
这个QnA应该是关于常见熊猫习语的一系列有用的用户指南的下一部分(参见关于转动的这篇文章,以及关于连接的这篇文章,我将在稍后介绍).
请注意,这篇文章并不是文档的替代品,所以请阅读它!一些例子来自那里.
我想在python pandas中为一个系列应用带参数的函数:
x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...
Run Code Online (Sandbox Code Playgroud)
该文档描述了对apply方法的支持,但它不接受任何参数.是否有接受参数的不同方法?或者,我错过了一个简单的解决方法吗?
更新(2017年10月): 请注意,由于此问题最初被要求apply()已更新pandas 以处理位置和关键字参数,上面的文档链接现在反映了这一点并显示了如何包含任一类型的参数.
我一直在寻找通过python文档和论坛选择列的方法,但索引列上的每个示例都过于简单.
假设我有一个10 x 10的数据帧
df = DataFrame(randn(10, 10), index=range(0,10), columns=['A', 'B', 'C', 'D','E','F','G','H','I','J'])
Run Code Online (Sandbox Code Playgroud)
到目前为止,所有文档都只是一个索引的简单例子
subset = df.loc[:,'A':'C']
Run Code Online (Sandbox Code Playgroud)
要么
subset = df.loc[:,'C':]
Run Code Online (Sandbox Code Playgroud)
但是当我尝试索引多个非顺序列时,我得到一个错误,就像这样
subset = df.loc[:,('A':'C', 'E')]
Run Code Online (Sandbox Code Playgroud)
如果我想从A到C,E和G中选择A列,我将如何在Pandas中编入索引?看来这个逻辑不起作用
subset = df.loc[:,('A':'C', 'E', 'G':'I')]
Run Code Online (Sandbox Code Playgroud)
我觉得解决方案非常简单,但我无法解决这个错误.谢谢!
这是我的问题,我有一个这样的数据帧:
Depr_1 Depr_2 Depr_3
S3 0 5 9
S2 4 11 8
S1 6 11 12
S5 0 4 11
S4 4 8 8
Run Code Online (Sandbox Code Playgroud)
我只是想计算整个数据帧的平均值,因为以下不起作用:
df.mean()
Run Code Online (Sandbox Code Playgroud)
然后我提出:
df.mean().mean()
Run Code Online (Sandbox Code Playgroud)
但是这个技巧不适用于计算标准偏差.我最后的尝试是:
df.get_values().mean()
df.get_values().std()
Run Code Online (Sandbox Code Playgroud)
除了在后一种情况下,它使用numpy中的mean()和std()函数.这对于平均值来说不是问题,但它适用于std,因为pandas函数默认使用ddof=1,而不像numpy那样ddof=0.
如果有一个库我将使用至少两种方法,那么下面的性能或内存使用是否有任何差异?
from X import method1, method2
Run Code Online (Sandbox Code Playgroud)
和
import X
Run Code Online (Sandbox Code Playgroud) pandas read_csv函数似乎没有稀疏选项.我有csv数据,其中有大量零(它压缩得非常好,并且剥离任何0值都会将其减少到几乎原始大小的一半).
我已经尝试将它加载到密集矩阵中read_csv然后调用to_sparse,但是它需要很长时间并且在文本字段上窒息,尽管大多数数据都是浮点数.如果我pandas.get_dummies(df)先调用将分类列转换为1和0,那么调用to_sparse(fill_value=0)它需要花费大量时间,比我预期的大得多的数字表有更长的时间,大多数为零.即使我从原始文件中删除零并调用to_sparse()(以使填充值为NaN),也会发生这种情况.这也恰好不管我是否通过kind='block'或kind='integer'.
除了手工构建稀疏数据帧之外,是否有一种好的,平滑的方式可以直接加载稀疏的csv而不会占用大量不必要的内存?
下面是一些代码,用于创建具有3列浮点数据和一列文本数据的样本数据集.大约85%的浮点值为零,CSV的总大小约为300 MB,但您可能希望将其放大以真正测试内存约束.
np.random.seed(123)
df=pd.DataFrame( np.random.randn(10000000,3) , columns=list('xyz') )
df[ df < 1.0 ] = 0.0
df['txt'] = np.random.choice( list('abcdefghij'), size=len(df) )
df.to_csv('test.csv',index=False)
Run Code Online (Sandbox Code Playgroud)
这是一种简单的阅读方式,但希望有更好,更有效的方法:
sdf = pd.read_csv( 'test.csv', dtype={'txt':'category'} ).to_sparse(fill_value=0.0)
Run Code Online (Sandbox Code Playgroud)
编辑添加(来自JohnE): 如果可能,请在答案中提供有关读取大型CSV的一些相对性能统计数据,包括有关如何测量内存效率的信息(特别是因为内存效率比时钟时间更难测量).特别要注意的是,如果内存效率更高,那么较慢的(时钟时间)答案可能是最佳答案.
我这样做是为了制作分类变量数字
>>> df = pd.DataFrame({'x':['good', 'bad', 'good', 'great']}, dtype='category')
x
0 good
1 bad
2 good
3 great
Run Code Online (Sandbox Code Playgroud)
如何获取原始值和新值之间的映射?
我无法弄清楚为什么numba在这里击败numpy(超过3x).我是否在这里进行基准测试时遇到了一些根本性的错误?看起来像numpy的完美情况,不是吗?请注意,作为一个检查,我还运行了一个组合numba和numpy(未显示)的变体,正如预期的那样,与没有numba的numpy相同.
(顺便说一下这是一个后续问题:数字处理2d阵列的最快方法:数据帧vs系列vs阵列vs numba)
import numpy as np
from numba import jit
nobs = 10000
def proc_numpy(x,y,z):
x = x*2 - ( y * 55 ) # these 4 lines represent use cases
y = x + y*2 # where the processing time is mostly
z = x + y + 99 # a function of, say, 50 to 200 lines
z = z * ( z - .88 ) # of fairly simple numerical operations
return z
@jit …Run Code Online (Sandbox Code Playgroud) 我正在尝试将StringIO和BytesIO与pandas混合在一起,并努力解决一些基本问题.例如,我不能让下面的"输出"工作,而下面的"output2"确实有效.但是"输出"更接近我正在尝试的现实世界的例子."output2"中的方式来自一个老熊猫的例子,但对我来说并不是一个真正有用的方法.
import io # note for python 3 only
# in python2 need to import StringIO
output = io.StringIO()
output.write('x,y\n')
output.write('1,2\n')
output2 = io.StringIO("""x,y
1,2
""")
Run Code Online (Sandbox Code Playgroud)
它们的类型和内容似乎相同:
type(output) == type(output2)
Out[159]: True
output.getvalue() == output2.getvalue()
Out[160]: True
Run Code Online (Sandbox Code Playgroud)
但不,不一样:
output == output2
Out[161]: False
Run Code Online (Sandbox Code Playgroud)
更多我要解决的问题:
pd.read_csv(output) # ValueError: No columns to parse from file
pd.read_csv(output2) # works fine, same as reading from a file
Run Code Online (Sandbox Code Playgroud) 我有货币的df:
df = pd.DataFrame({'Currency':['$1.00','$2,000.00','(3,000.00)']})
Currency
0 $1.00
1 $2,000.00
2 (3,000.00)
Run Code Online (Sandbox Code Playgroud)
我想将'Currency'dtype转换为float,但我遇到括号字符串(表示负数)的问题.这是我目前的代码:
df[['Currency']] = df[['Currency']].replace('[\$,]','',regex=True).astype(float)
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
ValueError: could not convert string to float: (3000.00)
Run Code Online (Sandbox Code Playgroud)
我想要的dtype float是:
Currency
0 1.00
1 2000.00
2 -3000.00
Run Code Online (Sandbox Code Playgroud)