2014-01-06 41 views
3

我有一个csv从中我通过熊猫read_csv阅读,的Python - 地图()分裂,并获得第一部分只

data = pandas.read_csv(file)

现在,一小部分是这样的,

data['interest']:

one.a 
two.a 
three.a 
four.b 

等等...

我想创建一个新的pandas系列,比如说,

data['i']仅包含的data['interest']第一部分,也就是

one 
two 
three 
four 

现在我可以通过整个事情,split环,但可我用地图来做?

类似 - data['i'] = map(split_and_get_first_part, data['interest'])

+0

是“one.a”的字符串,而你只是想拆的“”字符?是否有使用map而不是列表理解的特定理由,并且您是否已经尝试编写'split_and_get_first_part'? – Useless

+0

'lambda x:“。”。join(x.split('。')[: - 1])' –

回答

5

你可以使用map方法:

data['interest'].map(lambda x:x.split('.', 1)[0]) 

import pandas as pd 

data = pd.DataFrame({'interest':['one.a', 'two.a', 'three.a', 'four.b']}) 
data['i'] = data['interest'].map(lambda x:x.split('.', 1)[0]) 
print(data) 

产量

interest  i 
0 one.a one 
1 two.a two 
2 three.a three 
3 four.b four 
+0

你是天才。我不知道为什么我没有考虑使用'map'方法! – ComputerFellow

+0

'split(“。”,1)[0]'优化而不是split(“。”)[0]'值得另一个评论和赞美。 – ComputerFellow

+0

嗨@unutbu - 你能帮我解决这个问题吗? http://stackoverflow.com/questions/20951840/pandas-groupby-and-create-new-dataframe – ComputerFellow

0

尝试:

split_and_get_first_part = lambda x: ".".join(x.split('.')[:-1] if '.' in x else x 
data['i'] = map(split_and_get_first_part, data['interest']) 

这涵盖了几个角落案例,例如多于一个点或完全没有点的字符串。

0

是的,你可以:

map(lambda s: s.split('.')[0], data['interest']) 

但它仍然需要遍历整个列表,这样,当其超过for循环更简洁,它不一定是更有效的。在这种情况下,map可能比for更有效,但您需要做一些测试以确定是否如此。值得注意的是,在Python 3中,map返回一个迭代器而不是一个列表,所以,根据你在做什么,它在Py3中可能更有效。

0

你需要实体专利法条约字符串,返回第一部分......这样

def split_first_part(str): 
    return str.split('.')[0] 

map(split_first_part, data['interest'])