根据另一列获取列值,并在pandas dataframe中获取字符串列表

时间:2018-10-10 10:52:39

标签: python python-3.x pandas multiple-columns

我尝试了link。但这不适用于下面给出的示例。 我尝试了loc [0]作为输出。我尝试了.item()。但是这些都不对我有帮助。

>>> df2 = pd.DataFrame({ 'Item':['[Phone]', '[Watch]', '[Pen]', '[Pencil]', '[Knife]'], 'RelatedItem': ['[Phone cover]', '[Watch strap]', '[Pen cap]', '[Pencil lead]', '[fork]'], 'CountinInventory':['20','50','40','80','90']})
>>> df2
    Item     RelatedItem   CountinInventory
0   [Phone]  [Phone cover]               20
1   [Watch]  [Watch strap]               50
2     [Pen]      [Pen cap]               40
3  [Pencil]  [Pencil lead]               80
4   [Knife]         [fork]               90
>>> df2.loc[df2['Item'] == 'Phone', 'RelatedItem']
Series([], Name: RelatedItem, dtype: object)
>>> df2.loc[df2['Item'] == 'Phone', 'RelatedItem', 'CountinInventory']
pandas.core.indexing.IndexingError: Too many indexers

我有此数据,当我喂食Phone时,我需要获取Phone coverCountinInventory值作为答案。请告知我在这里犯了什么错误。

2 个答案:

答案 0 :(得分:2)

我相信您需要str才能删除第一个[]和最后一个str.strip

mask = df2['Item'].str[1:-1] == 'Phone'
#alternative solution
#mask = df2['Item'].str.strip('[]') == 'Phone'

print (mask)
0     True
1    False
2    False
3    False
4    False
Name: Item, dtype: bool

如果使用list comprehension可能没有丢失的值,那么使用大数据会更快:

mask = [x[1:-1] == 'Phone'for x in df2['Item']]

mask = [x.strip('[]') == 'Phone'for x in df2['Item']]
print (mask)

[True, False, False, False, False]

最后选择多个列使用list

df3 = df2.loc[mask, ['RelatedItem', 'CountinInventory']]
print (df3)
     RelatedItem CountinInventory
0  [Phone cover]               20

答案 1 :(得分:1)

您还可以使用:

df.loc[df['Item'].str.contains('Phone'), ['RelatedItem',  'CountinInventory']]

错误too many indexers是因为df.loc []需要带有标签的标签,列表或切片对象的数组。但是您给了一系列“标签”。