2015-07-02 115 views
0

我有一个简单的文件,该文件列出名称是文本的一部分文本,然后单词创建边缘名单二分图:的Python:用熊猫

text,words 
ANC088,woods dig spirit controller father treasure_lost 
ANC089,controller dig spirit 
ANC090,woods ag_work tomb 
ANC091,well spirit_seen treasure 

pandas工作,我都这样了,虽然klugey解决方案得到节点的列表为二分图的两边,一边列出文本和其他的话,在这种情况下,与文字相关的:

import pandas as pd 

df = pd.read_csv(open('tales-02.txt', 'r')) 
node_list_0 = df['text'].values.tolist() 
node_list_1 = filter(None, sorted(set(' '.join(df['words'].values.tolist()).split(' ')))) 

这是不漂亮,但它工作,而且对我的小数据集足够快。

我需要的是这两个节点之间的边缘列表。我可以在csv这个,但我不知道如何在pandas做到这一点。这是我的工作csv

texts = csv.reader(open('tales-01.txt', 'rb'), delimiter=',', skipinitialspace=True) 

for row in texts: 
    for item in row[1:]: 
     edge_list.append((row[0], item)) 

我要指出,这个版本的输入是CSV一路

ANC088,woods,dig,spirit,controller,father,treasure_lost 
ANC089,controller,dig,spirit 

我调整的文件格式,使之更容易为我写的pandas的东西 - 如果有人也可以告诉我如何从纯粹的csv文件中获取节点列表,那就太棒了。

我宁愿这样做或者全部csv或全部pandas。我试图编写一个脚本,使用csv来获取节点列表,但我一直得到一个空列表。那时我转向pandas,每个人都告诉我我应该使用它。

回答

1

以下代码创建一个DataFrame,其中和word列来自文件tales-01.txt。这不是很漂亮(有更漂亮的解决方案吗?),但它似乎能完成这项工作。

df = (pd.read_csv('tales-01.txt',header=None) 
     .groupby(level=0).apply(
     lambda x : pd.DataFrame ([[x.iloc[0,0],v] 
            for v in x.iloc[0,1:]])) 
     .reset_index(drop=True) 
     .dropna() 
     .rename_axis({0:'text',1:'word'},axis=1) 
    ) 

这里是基于相同的想法的第二溶液,它使用zip代替for循环。它可能会更快。

def my_zip(d): 
    t,w = d.iloc[0,0],d.iloc[0,1:] 
    return pd.DataFrame(zip([t]*len(w), w)).dropna() 

df = (pd.read_csv('tales-01.txt',header=None) 
     .groupby(level=0) 
     .apply(my_zip) 
     .reset_index(drop=True) 
     .rename_axis({0:'text',1:'word'},axis=1) 
    ) 

结果是在这两种情况下是相同的:

 text   word 
0 ANC088   woods 
1 ANC088   dig 
2 ANC088   spirit 
3 ANC088  controller 
4 ANC088   father 
5 ANC088 treasure_lost 
6 ANC089  controller 
7 ANC089   dig 
8 ANC089   spirit 
+0

如果我添加'edge_list = df.values.tolist()'上面的第二个答案下面,我得到了我所需要的。我将在第二天左右花这些代码来了解它的工作原理,但这是一个可行的解决方案。我喜欢你使用'tales-01'。任何关于如何使用节点列表的建议?也就是说,有没有办法告诉'pandas'使用1行中的第一个项目来填充1列,并将其他所有内容放在第二列中? (SO礼节意味着我应该让这个第二个问题?) –

+0

对于任何好奇的人,这里是我提出的合并代码 - 我不确定'list(set(* .tolist))有多漂亮,但是它的工作原理和我写的! (下面是因为我无法弄清楚如何在评论中做一个代码块,我不想在@ dov-grobgeld的回复之后声称自己回答我的问题,所以我不想这么傲慢。 –

+0

' ''df =(pd.read_csv('tales-01.txt',header = None) .groupby(level = 0) .apply(lambda x:pd.DataFrame([[x.iloc [0,0] ,v] for v in x.iloc [0,1:]])) 。reset_index(drop = True) .dropna() .rename_axis({0:'text',1:'word'},axis = 1) ) edges = df.values.tolist() nodes_0 = list set(df ['text']。values.tolist())) nodes_1 = list(set(df ['word']。values.tolist()))'''' –