Pandas - 分组并创建新的DataFrame?

7
这是我的情况 -
In[1]: data
Out[1]: 
     Item                    Type
0  Orange           Edible, Fruit
1  Banana           Edible, Fruit
2  Tomato       Edible, Vegetable
3  Laptop  Non Edible, Electronic

In[2]: type(data)
Out[2]: pandas.core.frame.DataFrame

我想做的是创建一个只包含水果的数据框,所以我需要按这样的方式进行分组,即水果存在于类型中。我已经尝试过以下方法:grouped = data.groupby(lambda x: "Fruit" in x, axis=1),但我不知道这是否正确,我对 groupby 有一点难以理解。我该如何获得一个仅包含水果的新数据框呢?请注意保留 HTML 标记。

1
附注:在我看来,第一步应该是将您的“类型”分成(当然要选择更好的名称)“可食性”和“种类”。通常最好在开始时就将列拆分成这样一个真正的列,因为它既更容易又更安全地处理——避免了像“不可食用,绝对不是水果”这样包含“水果”的问题。 - DSM
当然,我没有在这里使用我的真实世界数据。 这是我能够使问题描述适应我的需要的最佳方式,在我拥有的真实世界数据中,它有点复杂,并且“类型”是任意长度的CSV。 - ComputerFellow
1
我没想到你真的在处理香蕉是否可食用的数据。;^) 但问题仍然存在:使用字符串包含性质可能会引发错误,即使它似乎对你的数据没有问题,因为它不会造成任何问题,直到它发生了。 - DSM
@DSM,哈哈,当然!听取建议! :) - ComputerFellow
2个回答

6
你可以使用:

data[data['Type'].str.contains('Fruit')]

import pandas as pd

data = pd.DataFrame({'Item':['Orange', 'Banana', 'Tomato', 'Laptop'],
                     'Type':['Edible, Fruit', 'Edible, Fruit', 'Edible, Vegetable', 'Non Edible, Electronic']})
print(data[data['Type'].str.contains('Fruit')])

产量
     Item           Type
0  Orange  Edible, Fruit
1  Banana  Edible, Fruit

x.str.contains('something') - 很好!我真的需要记住pandas的向量化字符串函数。它们非常方便。 - Joe Kington
1
在我的机器上,data[data.Type.apply(lambda x: 'Fruit' in x)] 似乎比 data[x.str.contains('Fruit')] 快了一点(每个循环195微秒对209微秒)。因此,str.contains 看起来只是语法糖。 - unutbu
非常感谢您告知我优化的事情! - ComputerFellow
1
如果数据集很大,@unutbu包含操作将会更快,因为它已经进行了cython优化。 - Jeff
4
这两个操作实际上略有不同,contains 更像是这样:reg = re.compile('Fruit'); data[data['Type'].apply(lambda x: bool(reg.search(x)))(同时 contains 处理 nan)。 - Jeff
显示剩余4条评论

5

groupby是完全不同的内容。它创建聚合的分组。基本上,它从这样的东西开始:

['a', 'b', 'a', 'c', 'b', 'b']

转化为类似于以下内容:

[['a', 'a'], ['b', 'b', 'b'], ['c']]

您需要的是df.apply

在较新版本的pandas中,有一个query方法,使这个过程更加高效和简便。

然而,实现您想要的一种方法是通过使用布尔数组:

mask = df.Type.apply(lambda x: 'Fruit' in x)

然后使用 df[mask] 从数据框中选择相关部分。或者,可以将其写成一行代码:

df[df.Type.apply(lambda x: 'Fruit' in x)]

作为一个完整的示例:
import pandas as pd
data = [['Orange', 'Edible, Fruit'],
        ['Banana', 'Edible, Fruit'],
        ['Tomato', 'Edible, Vegtable'],
        ['Laptop', 'Non Edible, Electronic']]
df = pd.DataFrame(data, columns=['Item', 'Type'])

print df[df.Type.apply(lambda x: 'Fruit' in x)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接