[英]How to Filter a Pandas Dataframe Column of Lists
目標:根據列表列的值過濾行。
鑒於:
指數 | pos_order |
---|---|
3192304 | ['VB', 'DT', 'NN', 'NN', 'NN', 'NN'] |
1579035 | ['VB', 'PRP', 'VBP', 'NN', 'RB', 'IN', 'NNS', 'NN'] |
763020 | ['VB', 'VBP', 'PRP', 'JJ', 'IN', 'NN'] |
1289986 | ['VB', 'NN', 'IN', 'CD', 'CD'] |
69194 | ['VB', 'DT', 'JJ', 'NN'] |
3068116 | ['VB', 'JJ', 'IN', 'NN', 'NN'] |
1506722 | ['VB', 'NN', 'NNS', 'NNP'] |
3438101 | ['VB', 'VB', 'IN', 'DT', 'NNS', 'NNS', 'CC', 'NN', 'NN'] |
1376463 | ['VB', 'DT', 'NN', 'NN'] |
1903231 | ['VB', 'DT', 'PRP', 'VBP', 'JJ', 'IN', 'NNP', 'NNP'] |
我想找到一種方法來查詢此表以獲取存在給定模式的行。 例如,如果模式是['IN', 'NN']
,我應該得到第 763020 和 3068116 行,而不是第 3438101 行。所以要清楚,列表元素的順序也很重要。
我試着這樣做,這樣:
def target_phrase(pattern_tested, pattern_to_match):
if ''.join(map(str, pattern_to_match)) in ''.join(map(str, pattern_tested)):
print (pattern_tested)
return True
else:
return False
我可以使用 pandas 之外的列表運行此代碼,但是當我嘗試使用類似的東西時:
target_phrase(df.loc[5]['pos_order'], ['IN', 'NN'])
代碼失敗。
有什么線索嗎?
首先,讓我提供一個target_phrase
的簡化視圖:
def target_phrase(pattern_tested, pattern_to_match):
return ''.join(map(str, pattern_to_match)) in ''.join(map(str, pattern_tested))
為什么代碼不起作用? 因為target_phrase
期望第一個參數是一個列表,而不是 pandas dataframe。 正確的語法如下:
df['pattern_matched'] = df.apply(lambda x: target_phrase(x['pos_order'],
['IN', 'NN']), axis=1)
此 function 按行應用target_phrase
。
事實證明,這是一系列事情的結合,Kate 和 Serge 一起讓我想明白了。
因為我擁有一切,被比較的數據類型並不相似。 我正在將字符串與列表進行比較。 我必須添加代碼來將看起來像列表的字符串轉換為列表——Serge 的貢獻。 完成后,感謝 Kate,我能夠成功運行 lambda。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.