这个问题已经在这里有了答案:
如果我有一个空的数据框:
columns = ['Date', 'Name', 'Action','ID']
df = pd.DataFrame(columns=columns)
有没有一种方法可以向此新创建的数据框追加新行? 目前,我必须创建一个字典,将其填充,然后将字典附加到最后的数据框中。 有更直接的方法吗?
当我尝试读取由以前的熊猫版本保存的泡菜文件时,结果为ImportError
。
ImportError:没有名为“ pandas.core.internals.managers”的模块; 'pandas.core.internals'不是一个包
在stackoverflow上没有遇到任何问题,因此我想针对这个特定问题分享我的解决方案。
我想获取基于条件选择的数据帧行数。 我尝试了以下代码。
print df[(df.IP == head.idxmax()) & (df.Method == 'HEAD') & (df.Referrer == '"-"')].count()
输出:
IP 57
Time 57
Method 57
Resource 57
Status 57
Bytes 57
Referrer 57
Agent 57
dtype: int64
输出显示数据帧中每一列的计数。 相反,我需要获得满足以上所有条件的单一计数? 这该怎么做? 如果您需要有关我的数据框的更多说明,请告诉我。
我有一个如下数据框
color x y
0 red 0 0
1 red 1 1
2 red 2 2
3 red 3 3
4 red 4 4
5 red 5 5
6 red 6 6
7 red 7 7
8 red 8 8
9 red 9 9
10 blue 0 0
11 blue 1 1
12 blue 2 4
13 blue 3 9
14 blue 4 16
15 blue 5 25
16 blue 6 36
17 blue 7 49
18 blue 8 64
19 blue 9 81
我最终想要两行,一条蓝色,一条红色。 红线应基本上为y = x,蓝线应为y = x ^ 2
当我执行以下操作时:
df.plot(x='x', y='y')
输出是这样的:
有没有办法让大熊猫知道有两套? 并将它们相应地分组。 我希望能够将“颜色”列指定为集合区分符
我刚开始使用Pandas,正在使用3005524316772631551552方法读取csv文件。 我遇到的困难是阻止熊猫将我的电话号码转换为大数字,而不是将它们保留为字符串。 我定义了一个转换器,该转换器只保留数字,但后来仍然转换为数字。 当我更改转换器以在电话号码前加一个“ z”时,它们就停留在字符串上。 有什么办法可以保持它们的字符串而不修改字段的值?
我喜欢过滤掉字符串长度不等于10的数据。
如果我尝试过滤掉列A或B的字符串长度不等于10的任何行,则尝试这样做。
df=pd.read_csv('filex.csv')
df.A=df.A.apply(lambda x: x if len(x)== 10 else np.nan)
df.B=df.B.apply(lambda x: x if len(x)== 10 else np.nan)
df=df.dropna(subset=['A','B'], how='any')
这工作缓慢,但正在工作。
但是,当A中的数据不是字符串而是数字(在read_csv读取输入文件时解释为数字)时,有时会产生错误。
File "<stdin>", line 1, in <lambda>
TypeError: object of type 'float' has no len()
我相信应该有更高效,更优雅的代码来代替。
根据下面的答案和评论,我找到的最简单的解决方案是:
df=df[df.A.apply(lambda x: len(str(x))==10]
df=df[df.B.apply(lambda x: len(str(x))==10]
要么
df=df[(df.A.apply(lambda x: len(str(x))==10) & (df.B.apply(lambda x: len(str(x))==10)]
or
df=df[(df.A.astype(str).str.len()==10) & (df.B.astype(str).str.len()==10)]
我想知道是否存在一种将多记录JSON文件(每行是一个JSON dict)读入熊猫数据帧的内存有效方式。 下面是带有工作解决方案的2行示例,我可能需要非常多的记录。 示例用途是处理Hadoop Pig JSonStorage函数的输出。
import json
import pandas as pd
test='''{"a":1,"b":2}
{"a":3,"b":4}'''
#df=pd.read_json(test,orient='records') doesn't work, expects []
l=[ json.loads(l) for l in test.splitlines()]
df=pd.DataFrame(l)
我想知道是否有一种更简单,内存效率更高的方法从pandas DataFrame中选择行和列的子集。
例如,给定此数据框:
df = DataFrame(np.random.rand(4,5), columns = list('abcde')) print df a b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992
我只希望其中列'c'的值大于0.5的那些行,但是对于那些行,我只需要列'b'和'e'。
这是我想出的方法-也许有更好的“熊猫”方式?
locs = [df.columns.get_loc(_) for _ in ['a', 'd']] print df[df.c > 0.5][locs] a d 0 0.945686 0.892892
我的最终目标是将结果转换为numpy数组,然后传递给sklearn回归算法,因此我将使用上面的代码,如下所示:
training_set = array(df[df.c > 0.5][locs])
...这让我很烦,因为我最终在内存中存储了一个巨大的数组副本。 也许还有更好的方法吗?
是否有一种简单的方法可以将数据帧(甚至其中的一部分)导出到LaTeX?
我在Google中搜索,仅能使用asciitables找到解决方案。
我读了我的数据
import pandas as pd
df = pd.read_csv('/path/file.tsv', header=0, delimiter='\t')
print df
并获得:
id text
0 361.273 text1...
1 374.350 text2...
2 374.350 text3...
如何从上述数据框中删除id
列? 我尝试了以下方法:
import pandas as pd
df = pd.read_csv('/path/file.tsv', header=0, delimiter='\t')
print df.drop('id', 1)
但这引发了这个异常:
ValueError: labels ['id'] not contained in axis
我是Spark-DataFrame API的初学者。
我使用此代码将制表符分隔的csv加载到Spark Dataframe中
lines = sc.textFile('tail5.csv')
parts = lines.map(lambda l : l.strip().split('\t'))
fnames = *some name list*
schemaData = StructType([StructField(fname, StringType(), True) for fname in fnames])
ddf = sqlContext.createDataFrame(parts,schemaData)
假设我用Spark从新文件中创建了DataFrame,并使用内置方法toPandas()将其转换为熊猫,
即:
import pandas
d = {'col1': 2, 'col2': 2.5}
df = pandas.DataFrame(data=d, index=[0])
print(df['col2'])
print(df.col2)
输出是相同的。
这个答案适用于这种情况吗?
Python中的方括号和点表示法之间有什么区别?
我有一个DataFrame
像这样:
df.cumsum()
:
fruit val1 val2
0 orange 15 3
1 apple 10 13
2 mango 5 5
如何获得熊猫仅在df.cumsum()
上给我累计和百分比的列?
所需的输出:
df.cumsum()
:
fruit val1 val2 cum_sum cum_perc
0 orange 15 3 15 50.00
1 apple 10 13 25 83.33
2 mango 5 5 30 100.00
我尝试了df.cumsum()
,但它给了我这个错误:
TypeError:输入类型不支持ufunc'isnan',并且根据强制转换规则“ safe”,不能将输入安全地强制转换为任何受支持的类型
在pivot
方法的Pandas文档中,我们具有:
Examples
--------
>>> df
foo bar baz
0 one A 1.
1 one B 2.
2 one C 3.
3 two A 4.
4 two B 5.
5 two C 6.
>>> df.pivot('foo', 'bar', 'baz')
A B C
one 1 2 3
two 4 5 6
我的foo
的结构如下:
name id x
----------------------
0 john 1 0
1 john 2 0
2 mike 1 1
3 mike 2 0
我想要这样的东西:
1 2 # (this is the id as columns)
----------------------
mike 0 0 # (and this is the 'x' as values)
john 1 0
但是当我运行foo
方法时,它的意思是:
*** ReshapeError: Index contains duplicate entries, cannot reshape
这没有意义,即使在示例中,在foo
列上也有重复的条目。 我将name
列用作数据透视表的索引,即pivot
方法调用的第一个参数。
我想将由元素列表组成的pandas列分解为与唯一元素一样多的列(即one-hot-encode
它们(值1
表示行中存在的给定元素,如果值不存在则值为0
)。
例如,以数据框df
Col1 Col2 Col3
C 33 [Apple, Orange, Banana]
A 2.5 [Apple, Grape]
B 42 [Banana]
我想将其转换为:
df
Col1 Col2 Apple Orange Banana Grape
C 33 1 1 1 0
A 2.5 1 0 0 1
B 42 0 0 1 0
如何使用pandas / sklearn实现此目的?
对于大熊猫,有人会知道,除了
(i)pandas
、dtype
(以及object
的其他变体,例如float32
、int8
等)
(ii)pandas
(iii)pandas
、dtype
例如字符串列,始终具有dtype
的pandas
?
或者,我想知道,除了上面的列表中的(i),(ii)和(iii)之外,是否还有其他数据类型,使得pandas
不是dtype
还是object
?
使用Python在Pandas数据框中创建星期几列
我想将csv文件读取到pandas数据框中,将一列日期从字符串格式解析为date对象,然后生成一个新列以指示星期几。
这就是我正在尝试的:
我想做的是这样的:
import pandas as pd
import csv
df = pd.read_csv('data.csv', parse_dates=['date']))
df['day-of-week'] = df['date'].weekday()
AttributeError: 'Series' object has no attribute 'weekday'
谢谢您的帮助。詹姆士
这是我要获取的示例:
我有:
import pandas as pd
df = pd.DataFrame({'A' : [0, 1], 'B' : [1, 6]})
我的目标是:
',A,B\n0,0,1\n1,1,6\n'
我可以通过懒惰和恐怖来实现:
df.to_csv('temp.csv') # create unnecessary file
body = open('temp.csv').read()
同样to_string()
方法看起来非常有前途; 但是,我能想到的最好的方法是:
body = df.to_string()[1:].replace(' ', ',') + '\n'
这不会创建不必要的文件,但是看起来很草率,也许不是很可靠。
我是否缺少一个更简单的解决方案?
我已将以下CSV文件输入到iPython Notebook:
public = pd.read_csv("categories.csv")
public
我也将pdas导入为pd,将numpy导入为np,将matplotlib.pyplot导入为plt。 存在以下数据类型(以下是摘要-大约有100列)
In [36]: public.dtypes
Out[37]: parks object
playgrounds object
sports object
roading object
resident int64
children int64
我想将“公园”,“运动场”,“运动”和“道路”更改为类别(它们具有李克特量表响应-尽管每一列都有不同类型的李克特响应(例如,一个人“强烈同意”,“同意” 等),另一个具有“非常重要”,“重要”等),其余部分保留为int64。
我能够创建一个单独的数据框public1,并使用以下代码将其中一列更改为类别类型:
public1 = {'parks': public.parks}
public1 = public1['parks'].astype('category')
但是,当我尝试使用此代码一次更改数字时,我没有成功:
public1 = {'parks': public.parks,
'playgrounds': public.parks}
public1 = public1['parks', 'playgrounds'].astype('category')
尽管如此,我不想仅使用类别列创建单独的数据框。 我希望它们在原始数据框中更改。
我尝试了多种方法来实现这一目标,然后在此处尝试了以下代码:Pandas:更改列的数据类型...
public[['parks', 'playgrounds', 'sports', 'roading']] = public[['parks', 'playgrounds', 'sports', 'roading']].astype('category')
并得到以下错误:
NotImplementedError: > 1 ndim Categorical are not supported at this time
有没有一种方法可以将“公园”,“游乐场”,“运动”,“道路”更改为类别(这样就可以分析李克特量表的响应),剩下“居民”和“孩子”(以及其他94列 是字符串,整数+浮点数)吗? 还是有更好的方法来做到这一点? 如果有人有任何建议和/或反馈,我将不胜感激..am慢慢地秃头撕开我的头发!
提前谢谢了。
编辑添加-我正在使用Python 2.7。
我想知道是否有某种方式将所有DataFrame负数替换为零?