PYTHON:如何从列中出现的单词创建列?

Ale*_*lex 2 python dataframe pandas

我有一个数据框,例如如下:

import pandas as pd

my_df = pd.DataFrame({'col1':['A', 'B', 'C', 'A', 'A', 'B'], 
                      'col2':['foo bar', 'bar', 'something foo', 'foo', 'bar', 'foo']})
Run Code Online (Sandbox Code Playgroud)

我想为其中一列中出现的每个单词生成列,例如col2,并计算该行中出现的次数.

  col1   col2          foo bar something 
0    A  foo bar         1   1    0
1    B  bar             0   1    0
2    C  something foo   1   0    1
3    A  foo             1   0    0
4    A  bar             0   1    0
5    B  foo             1   0    0
Run Code Online (Sandbox Code Playgroud)

我的数据框比这个例子要大得多.每列可以有多个单词.

jez*_*ael 5

你需要join+ get_dummies:

df = my_df.join(pd.get_dummies(my_df['col2']))
print (df)
  col1       col2  bar  foo  something
0    A        foo    0    1          0
1    B        bar    1    0          0
2    C  something    0    0          1
3    A        foo    0    1          0
4    A        bar    1    0          0
5    B        foo    0    1          0
Run Code Online (Sandbox Code Playgroud)

编辑 - 是必要的str.get_dummies:

df = my_df.join(my_df['col2'].str.get_dummies(' '))
print (df)
  col1           col2  bar  foo  something
0    A        foo bar    1    1          0
1    B            bar    1    0          0
2    C  something foo    0    1          1
3    A            foo    0    1          0
4    A            bar    1    0          0
5    B            foo    0    1          0
Run Code Online (Sandbox Code Playgroud)

但如果一行中有多个相同的单词并需要计算它们:

my_df = pd.DataFrame({'col1':['A', 'B', 'C', 'A', 'A', 'B'], 
                      'col2':['foo bar foo', 'bar', 'something foo', 'foo', 'bar', 'foo']})
print (my_df)
  col1           col2
0    A    foo bar foo
1    B            bar
2    C  something foo
3    A            foo
4    A            bar
5    B            foo

df = my_df.join(my_df['col2'].str.split(expand=True)
                             .apply(pd.value_counts,1)
                             .fillna(0)
                             .astype(int))
print (df)
  col1           col2  bar  foo  something
0    A    foo bar foo    1    2          0
1    B            bar    1    0          0
2    C  something foo    0    1          1
3    A            foo    0    1          0
4    A            bar    1    0          0
5    B            foo    0    1          0
Run Code Online (Sandbox Code Playgroud)