我有一个Pandas数据帧列表,我想将它们组合成一个Pandas数据帧.我使用的是Python 2.7.10和Pandas 0.16.2
我从以下位置创建了数据框列表:
import pandas as pd
dfs = []
sqlall = "select * from mytable"
for chunk in pd.read_sql_query(sqlall , cnxn, chunksize=10000):
dfs.append(chunk)
Run Code Online (Sandbox Code Playgroud)
这将返回数据帧列表
type(dfs[0])
Out[6]: pandas.core.frame.DataFrame
type(dfs)
Out[7]: list
len(dfs)
Out[8]: 408
Run Code Online (Sandbox Code Playgroud)
这是一些示例数据
# sample dataframes
d1 = pd.DataFrame({'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.]})
d2 = pd.DataFrame({'one' : [5., 6., 7., 8.], 'two' : [9., 10., 11., 12.]})
d3 = pd.DataFrame({'one' : [15., 16., 17., 18.], 'two' : [19., 10., 11., …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种有效的方法来从DataFrame列中的字符串中删除不需要的部分.
数据看起来像:
time result
1 09:00 +52A
2 10:00 +62B
3 11:00 +44a
4 12:00 +30b
5 13:00 -110a
Run Code Online (Sandbox Code Playgroud)
我需要将这些数据修剪为:
time result
1 09:00 52
2 10:00 62
3 11:00 44
4 12:00 30
5 13:00 110
Run Code Online (Sandbox Code Playgroud)
我试过了.str.lstrip('+-').str.rstrip('aAbBcC'),但得到一个错误:
TypeError: wrapper() takes exactly 1 argument (2 given)
Run Code Online (Sandbox Code Playgroud)
任何指针将不胜感激!
我有一个名称的csv文件params.csv.我打开ipython qtconsole并用以下方法创建了一只熊猫dataframe:
import pandas
paramdata = pandas.read_csv('params.csv', names=paramnames)
Run Code Online (Sandbox Code Playgroud)
其中,paramnames是一个字符串对象的python列表.示例paramnames(实际列表的长度为22):
paramnames = ["id",
"fc",
"mc",
"markup",
"asplevel",
"aspreview",
"reviewpd"]
Run Code Online (Sandbox Code Playgroud)
在ipython提示符下,如果我输入paramdata并按回车键,那么我不会获得带有列和值的数据框,如Pandas网站上的示例所示.相反,我获得有关数据帧的信息.我明白了:
In[35]: paramdata
Out[35]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 59 entries, 0 to 58
Data columns:
id 59 non-null values
fc 59 non-null values
mc 59 non-null values
markup 59 non-null values
asplevel 59 non-null values
aspreview 59 non-null values
reviewpd 59 non-null values
Run Code Online (Sandbox Code Playgroud)
如果我键入,paramdata['mc']那么我确实得到了mc列的预期值.我有两个问题:
(1)在pandas网站上的例子中(例如,参见 …
我知道,如果我使用randn,
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
Run Code Online (Sandbox Code Playgroud)
给了我正在寻找的东西,但是有正态分布的元素.但是,如果我只想要随机整数怎么办?
randint通过提供范围来工作,但不提供类似的数组randn.那么如何在某个范围之间使用随机整数呢?
给出以下(完全矫枉过正的)数据框示例
import pandas as pd
import datetime as dt
df = pd.DataFrame({
"date" : [dt.date(2012, x, 1) for x in range(1, 11)],
"returns" : 0.05 * np.random.randn(10),
"dummy" : np.repeat(1, 10)
})
Run Code Online (Sandbox Code Playgroud)
是否存在将两个不同的聚合函数应用于同一列的现有内置方法,而无需agg多次调用?
语法上错误但直观正确的方法是:
# Assume `function1` and `function2` are defined for aggregating.
df.groupby("dummy").agg({"returns":function1, "returns":function2})
Run Code Online (Sandbox Code Playgroud)
显然,Python不允许重复键.是否还有其他表达输入的方式agg?也许一个元组列表[(column, function)]会更好,允许多个函数应用于同一列?但它似乎只接受一本字典.
除了定义一个仅应用其中的两个函数的辅助函数之外,还有一个解决方法吗?(无论如何,它如何与聚合一起工作?)
目标
我有一个Pandas数据框,如下所示,有多列,想得到列的总数,MyColumn.
数据框 -df:
print df
X MyColumn Y Z
0 A 84 13.0 69.0
1 B 76 77.0 127.0
2 C 28 69.0 16.0
3 D 28 28.0 31.0
4 E 19 20.0 85.0
5 F 84 193.0 70.0
Run Code Online (Sandbox Code Playgroud)
我的尝试:
我试图使用groupby和得到列的总和.sum():
Total = df.groupby['MyColumn'].sum()
print Total
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
TypeError: 'instancemethod' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)
预期产出
我原本预计输出如下:
319
Run Code Online (Sandbox Code Playgroud)
或者,我希望df使用包含总数的新row标题进行编辑TOTAL:
X MyColumn Y Z
0 A …Run Code Online (Sandbox Code Playgroud) 我熟悉"矢量化"的概念,以及熊猫如何使用矢量化技术来加速计算.矢量化函数在整个系列或DataFrame上广播操作,以实现比传统迭代数据更大的加速.
但是,我很惊讶地看到很多代码(包括Stack Overflow的答案)提供了解决问题的方法,这些问题涉及使用for循环和列表推导来循环数据.阅读完文档后,对API有了不错的理解,我认为循环是"坏的",并且应该"永远"迭代数组,系列或DataFrame.那么,为什么我会不时地看到用户提出循环解决方案呢?
因此,要总结......我的问题是:
是否for循环真正的"坏"?如果不是,在什么情况下它们会比使用更传统的"矢量化"方法更好?1
1 - 虽然这个问题确实听起来有点宽泛,但事实是,当for循环通常比传统的迭代数据更好时,存在非常具体的情况.这篇文章旨在为后人捕捉这一点.
我试图重新索引一个pandas DataFrame对象,就像这样,
From:
a b c
0 1 2 3
1 10 11 12
2 20 21 22
To :
b c
1 2 3
10 11 12
20 21 22
Run Code Online (Sandbox Code Playgroud)
我正在解决这个问题,如下所示,我得到了错误的答案.关于如何做到这一点的任何线索?
>>> col = ['a','b','c']
>>> data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)
>>> data
a b c
0 1 2 3
1 10 11 12
2 20 21 22
>>> idx2 = data.a.values
>>> idx2
array([ 1, 10, 20], dtype=int64)
>>> data2 = DataFrame(data,index=idx2,columns=col[1:])
>>> data2
b c
1 11 12 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的Stata代码重新编程为Python以提高速度,我指出了PANDAS的方向.但是,我很难绕过如何处理数据.
假设我想迭代列标题'ID'中的所有值.如果该ID与特定数字匹配,那么我想更改两个对应的值FirstName和LastName.
在Stata中它看起来像这样:
replace FirstName = "Matt" if ID==103
replace LastName = "Jones" if ID==103
Run Code Online (Sandbox Code Playgroud)
因此,这将FirstName中与ID == 103的值对应的所有值替换为Matt.
在PANDAS,我正在尝试这样的事情
df = read_csv("test.csv")
for i in df['ID']:
if i ==103:
...
Run Code Online (Sandbox Code Playgroud)
不知道从哪里开始.有任何想法吗?
如何将pandas数据框打印为一个漂亮的基于文本的表,如下所示?
+------------+---------+-------------+
| column_one | col_two | column_3 |
+------------+---------+-------------+
| 0 | 0.0001 | ABCD |
| 1 | 1e-005 | ABCD |
| 2 | 1e-006 | long string |
| 3 | 1e-007 | ABCD |
+------------+---------+-------------+
Run Code Online (Sandbox Code Playgroud)