如何使用Python从数据框中的每个字符串中获取第一个单词?

pandas

3921 观看

2回复

322 作者的声誉

我有一个名为“ data”的Pandas DataFrame,其中有2列50行,每行填充一到两行文本,这些文本是从.tsv文件导入的。除字符串外,某些问题还可能包含整数和浮点数。我试图提取每个句子的第一个单词(在两列中),但是始终出现此错误:AttributeError:'DataFrame'对象没有属性'str'。

起初,我以为该错误是由于我对“ data.str.split”的错误使用而引起的,但是我所做的所有Google更改都失败了。然后我通过文件可能不会由所有字符串组成。因此,我在文件上尝试了“ data.astype(str)”,但仍然存在相同的错误。有什么建议么?非常感谢!

这是我的代码:

import pandas as pd
questions = "questions.tsv"
data = pd.read_csv(questions, usecols = [3], nrows = 50, header=1, sep="\t")
data = data.astype(str)
first_words = data.str.split(None, 1)[0]
作者: twhale 的来源 发布者: 2017 年 9 月 15 日

回应 2


3

416647 作者的声誉

决定

采用:

first_words = data.apply(lambda x: x.str.split().str[0])

要么:

first_words = data.applymap(lambda x: x.split()[0])

样品:

data = pd.DataFrame({'a':['aa ss ss','ee rre', 1, 'r'],
                   'b':[4,'rrt ee', 'ee www ee', 6]})
print (data)
          a          b
0  aa ss ss          4
1    ee rre     rrt ee
2         1  ee www ee
3         r          6

data = data.astype(str)
first_words = data.apply(lambda x: x.str.split().str[0])
print (first_words)
    a    b
0  aa    4
1  ee  rrt
2   1   ee
3   r    6

first_words = data.applymap(lambda x: x.split()[0])
print (first_words)
    a    b
0  aa    4
1  ee  rrt
2   1   ee
3   r    6
作者: jezrael 发布者: 2017 年 9 月 15 日

1

179529 作者的声誉

问题是您尝试在上使用pd.Series.str字符串访问器pd.DataFrame。不幸的是,这是pd.Series唯一的属性。这意味着您需要在pd.Series上下文中使用它。您可以通过多种方式来完成。

设置
假设您的数据框如下所示

              Col1               Col2
0   this is a test        hello world
1  this is another          pandas123
2            test3       tommy trojan
3         etcetera  one more sentence

选项1
使用stack的2维数据帧转换成一系列的...然后用串访问

#  Make a
#  Series
#  /----\    
df.stack().str.split(n=1).str[0].unstack()
#                                 \_____/
#                                 Turn it
#                                   Back

       Col1       Col2
0      this      hello
1      this  pandas123
2     test3      tommy
3  etcetera        one

选项2
或者您可以使用分别在每列上pd.DataFrame.apply使用pd.Series.str访问器。
@jezrael的答案对此进行了介绍。

df.apply(lambda x: x.str.split(n=1).str[0])

       Col1       Col2
0      this      hello
1      this  pandas123
2     test3      tommy
3  etcetera        one

选项3
使用理解

pd.DataFrame({c: df[c].str.split(n=1).str[0] for c in df})

       Col1       Col2
0      this      hello
1      this  pandas123
2     test3      tommy
3  etcetera        one

您会注意到,在所有选项中,我们strpd.Series对象而非pd.DataFrame对象上使用。

作者: piRSquared 发布者: 2017 年 9 月 15 日
32x32