2015-04-19 101 views
0

我有一个这样的文件:如何用python熊猫替换逗号?

name|count_dic 
name1 |{'x1':123,'x2,bv.':435,'x3':4} 
name2|{'x2,bv.':435,'x5':98} 
etc. 

我试图将数据加载到数据帧和计数在count_dic键的数量。问题在于用逗号将分词项分隔开来,而且其中一些键包含逗号。我正在寻找一种方法能够与键替换逗号“ - ”,然后可以到不同的键,值对在count_dic.something这样的分离:

name|count_dic 
name1 |{'x1':123,'x2-bv.':435,'x3':4} 
name2|{'x2-bv.':435,'x5':98} 
etc. 

这是我完成。

df = pd.read_csv('file' ,names = ['name','count_dic'],delimiter='|') 
data = json.loads(df.count_dic) 

,我得到以下错误:

TypeError: the JSON object must be str, not 'Series' 

是否有任何身体有什么建议?

+0

您的标题不会描述实际的问题 - 编辑它,让其他人可以找到他们想要的东西? – cphlewis

回答

1

您可以使用ast.literal_eval作为一个转换器,用于加载数据帧,因为它似乎你有这更多的Python dict样...... JSON使用双引号的数据 - 例如:

import pandas as pd 
import ast 

df = pd.read_csv('file', delimiter='|', converters={'count_dic': ast.literal_eval}) 

给你的DF:

name       count_dic 
0 name1 {'x2,bv.': 435, 'x3': 4, 'x1': 123} 
1 name2   {'x5': 98, 'x2,bv.': 435} 

由于count_dic实际上是一个dict,那么你可以申请len拿到钥匙的数量,例如:在

df.count_dic.apply(len) 

结果:

0 3 
1 2 
Name: count_dic, dtype: int64 
+0

谢谢,这解决了我的问题。不知道ast.literal,所以它可以用来将任何字符串转换为python可识别的值,如列表或字典或元组等?对? – UserYmY

+1

@UserYmY只要它们在语法上有效 - 有关更多信息,请参见https://docs.python.org/2/library/ast.html#ast.literal_eval。 –

+0

@ Jon Clements,谢谢。有没有一种方法可以使用此方法对count_dic的键和值进行索引? – UserYmY

1

一旦df如上述定义:

# get a value to play around with 
td = df.iloc[0].count_dic 
td 
# that looks like a dict definition... evaluate it? 
eval(td) 
eval(td).keys() #yup! 
#apply to the whole df 
df.count_dic = map(eval, df.count_dic) 

#and a hint towards your key-counting 
map(lambda i: i.keys(), df.count_dic)