2017-04-23 51 views
0

什么是从字符串数组像这样得到的最简单的方法:字符串数组用字列数据帧

arr = ['abc def ghi', 'def jkl xyz', 'abc xyz', 'jkl xyz'] 

的数据帧,其中每列是一个字,每行包含0或1,具体取决于如果该字出现在字符串中。事情是这样的:

abc def ghi jkl xyz 
0 1 1 1 0 0 
1 0 1 0 1 1 
2 1 0 0 0 1 
3 0 0 0 1 1 

编辑:这里是我的方法,这对我来说似乎是一个很多蟒蛇循环,而不是使用内置的大熊猫功能

labels = (' ').join(arr) 
labels = labels.split() 
labels = list(set(labels)) 
labels = sorted(labels) 

df = pd.DataFrame(np.zeros((len(arr), len(labels))), columns=labels) 
cols = list(df.columns.values) 

for i in range(len(arr)): 
    for col in cols: 
     if col in arr[i]: 
      df.set_value(i, col, 1) 
+0

抱歉,本网站不是为了解决您的任务,而是为了解决您在解决问题时出现的问题。 那么,你的代码到目前为止看起来如何? –

+0

我在问题中包含了我自己的代码,该代码可行,但看起来像很多手动Python循环。我想可能有更简单的方法来做到这一点熊猫 – pietz

回答

3

编辑 - 减少到3条必不可少线:

import pandas as pd 

arr = ['abc def ghi', 'def jkl xyz', 'abc xyz', 'jkl xyz'] 

words = set(' '.join(arr).split()) 
rows = [ { w : int(w in e) for w in words } for e in arr ] 
df = pd.DataFrame(rows) 

print(df) 

结果:

abc def ghi jkl xyz 
0 1 1 1 0 0 
1 0 1 0 1 1 
2 1 0 0 0 1 
3 0 0 0 1 1 
+0

感谢和抱歉,现在包括我的代码从一开始。你的运行速度比我的快一点 – pietz

+0

当然。你可以通过直接在行列表理解的结果上创建DataFrame来将它减少到2行,但是这样更具可读性:) – TLousky

+1

@pietz如果此解决方案有帮助,请接受它(勾选标记到边)以确认分辨率。 – Parfait