我有一个像下面这样的pandas数据框。我想在数据框的每一行中搜索一个文本,并突出显示该文本是否出现在该行中。
例如,我想搜索" jones"的每一行。我想忽略我的搜索词的情况。在下面的例子中,我想在一个名为" jones"的数据中添加一个新列。如果在第1和第2行找到该单词,它的值为1,1,0
我找到了this帖子,其中显示了如何在列中查找文字,但是当我有多列时,我怎么能找到一个文本 - 例如50+?我想要连接所有列并创建一个新列,但没有看到任何可以连接数据帧的所有列的函数(不要求键入每个列名)
我想为我拥有的多个关键字执行此操作。例如,我有关键字LLC, Co, Blue, alpha
以及更多(30 +)
sales = [{'account': 'Jones LLC', 'Jan': '150', 'Feb': '200', 'Mar': '140'},
{'account': 'Alpha Co', 'Jan': 'Jones', 'Feb': '210', 'Mar': '215'},
{'account': 'Blue Inc', 'Jan': '50', 'Feb': '90', 'Mar': '95' }]
df = pd.DataFrame(sales)
来源DF:
Feb Jan Mar account
0 200 150 140 Jones LLC
1 210 Jones 215 Alpha Co
2 90 50 95 Blue Inc
期望的DF:
Feb Jan Mar account jones llc co blue alpha
0 200 150 140 Jones LLC 1 1 0 0 0
1 210 Jones 215 Alpha Co 1 0 1 0 1
2 90 50 95 Blue Inc 0 0 0 1 0
答案 0 :(得分:2)
此处我们使用内置str
函数contains
的pandas以及apply
,然后将其与any
一起使用,如下所示,
search_string = 'Jones'
df[search_string] = (df.apply(lambda x: x.str.contains(search_string))
.any(axis=1).astype(int))
df
Out[2]:
Feb Jan Mar account Jones
0 200 150 140 Jones LLC 1
1 210 Jones 215 Alpha Co 1
2 90 50 95 Blue Inc 0
这可以很容易地扩展,因为contains
使用正则表达式来进行匹配。它还有一个案例arg,以便您可以使其不区分大小写,并搜索Jones
和jones
。
为了遍历搜索词列表,我们需要进行以下更改。通过将每个搜索结果(Series
)存储在列表中,我们使用该列表将该系列一起加入DataFrame
。我们这样做是因为我们不想为新的search_string搜索新列,
df_list = []
for search_string in ['Jones', 'Co', 'Alpha']:
#use above method but rename the series instead of setting to
# a columns. The append to a list.
df_list.append(df.apply(lambda x: x.str.contains(search_string))
.any(axis=1)
.astype(int)
.rename(search_string))
#concatenate the list of series into a DataFrame with the original df
df = pd.concat([df] + df_list, axis=1)
df
Out[5]:
Feb Jan Mar account Jones Co Alpha
0 200 150 140 Jones LLC 1 0 0
1 210 Jones 215 Alpha Co 1 1 1
2 90 50 95 Blue Inc 0 0 0
答案 1 :(得分:2)
更新:您似乎想要OneHotEncode一些特定的字词 - 您可以使用sklearn.feature_extraction.text.CountVectorizer:
In [131]: from sklearn.feature_extraction.text import CountVectorizer
In [132]: vocab = ['jones', 'llc', 'co', 'blue', 'alpha']
In [133]: cv = CountVectorizer(vocabulary=vocab)
In [134]: r = pd.SparseDataFrame((cv.fit_transform(df.select_dtypes('object').add(' ').sum(1)) != 0) * 1,
df.index,
cv.get_feature_names(),
default_fill_value=0)
In [135]: r
Out[135]:
jones llc co blue alpha
0 1 1 0 0 0
1 1 0 1 0 1
2 0 0 0 1 0
您也可以将其与原始DF合并:
In [137]: df = df.join(r)
In [138]: df
Out[138]:
Feb Jan Mar account jones llc co blue alpha
0 200 150 140 Jones LLC 1 1 0 0 0
1 210 Jones 215 Alpha Co 1 0 1 0 1
2 90 50 95 Blue Inc 0 0 0 1 0
<强>解释强>
将所有字符串列连接成一个列,使用空格作为分隔符:
In [165]: df.select_dtypes('object').add(' ').sum(1)
Out[165]:
0 200 150 140 Jones LLC LLC
1 210 Jones 215 Alpha Co
2 90 50 95 Blue Inc
dtype: object
生成具有所选特征的One Hot Encode稀疏矩阵:
In [176]: A = (cv.fit_transform(df.select_dtypes('object').add(' ').sum(1)) != 0) * 1
In [177]: A
Out[177]:
<3x5 sparse matrix of type '<class 'numpy.int32'>'
with 6 stored elements in Compressed Sparse Row format>
In [178]: A.A
Out[178]:
array([[1, 1, 0, 0, 0],
[1, 0, 1, 0, 1],
[0, 0, 0, 1, 0]])
In [179]: cv.get_feature_names()
Out[179]: ['jones', 'llc', 'co', 'blue', 'alpha']
从中生成一个SparseDataFrame:
In [174]: r = pd.SparseDataFrame((cv.fit_transform(df.select_dtypes('object').add(' ').sum(1)) != 0) * 1,
...: df.index,
...: cv.get_feature_names(),
...: default_fill_value=0)
...:
...:
In [175]: r
Out[175]:
jones llc co blue alpha
0 1 1 0 0 0
1 1 0 1 0 1
2 0 0 0 1 0