如何规范化Pandas dataframe列中的列表中的文本?

2024-06-11 07:41:10 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上,我有一个Ike三明治的数据框架,它有三列:成分/名称/价格,成分列是成分列表['x','y','z']

不幸的是,当我抓取列表时,它保留了奇怪的空格和其他格式,现在我想修改列中的成分列表,去掉空格并强制小写。在

示例:

0    [Avocado, French Dressing, Gouda, Ham, Sal...   Al Bundy    $9.99
1    [Caesar, Halal Chicken, Marinated Artichoke ...     Backstabber     $9.99
2    [Bacon, Swiss, Turkey]  Barry B.    $8.98
3    [Avocado, Havarti, Turkey]  Barry Z.    $8.98
4    [Avocado, Halal Chicken, Honey Mustard, Pep...  Bella   $9.99

问题是:

^{pr2}$

注意空格

我试着做:

for sandwich in mdf.ingredients:
    for ingredient in sandwich:
        ingredient = ingredient.strip()
        ingredient = ingredient.lower()

如果我在循环中打印component,就完成了我的目标,但实际上并没有改变数据帧中的值。在

有没有必要更改这些列表中的值,或者我需要用更正的值创建一个全新的列?在


Tags: 数据in框架列表for成分空格ingredient
1条回答
网友
1楼 · 发布于 2024-06-11 07:41:10

要修改df['ingredients'],可以将其分配给一个列表列表。例如,如果df如下所示:

import pandas as pd

df = pd.DataFrame([([u'Avocado', u' Havarti', u' Turkey'], 'Barry Z', 8.98),
                   ([u'Bacon', u' Swiss', u'Turkey'], 'Barry B', 8.98)],
                  columns=['ingredients', 'name', 'price'])

print(df)
#                     ingredients     name  price
# 0  [Avocado,  Havarti,  Turkey]  Barry Z   8.98
# 1      [Bacon,  Swiss,  Turkey]  Barry B   8.98

那么

^{pr2}$

使df看起来像

                  ingredients     name  price
0  [avocado, havarti, turkey]  Barry Z   8.98
1      [bacon, swiss, turkey]  Barry B   8.98

然而,拥有一列列表通常不太方便。如果你想找到所有以瑞士为原料的项目,你必须循环每一行,检查该行是否有瑞士,然后返回该行。在

相反,如果您规范化DataFrame,使每个项都有自己的列,那么这种搜索可以更容易地表达。在

例如:

import pandas as pd

df = pd.DataFrame([([u'Avocado', u' Havarti', u' Turkey'], 'Barry Z', 8.98),
                   ([u'Bacon', u' Swiss', u'Turkey'], 'Barry B', 8.98)],
                  columns=['ingredients', 'name', 'price'])

ingredients = df['ingredients'].apply(
    lambda lst: pd.Series(True, index=[item.strip().lower() for item in lst]))
ingredients.fillna(False, inplace=True)
del df['ingredients']
df = df.join(ingredients)
print(df)

生成一个看起来像

      name  price avocado  bacon havarti  swiss turkey
0  Barry Z   8.98    True  False    True  False   True
1  Barry B   8.98   False   True   False   True   True

现在要查找包含瑞士语的所有项目,您可以使用:

In [43]: df[df['swiss']]
Out[43]: 
      name  price avocado bacon havarti swiss turkey
1  Barry B   8.98   False  True   False  True   True

顺便说一下,这个代码:

for ingredient in sandwich:
    ingredient = ingredient.strip()

不影响sandwich,因为在循环内部,变量ingredient正在将重新分配到一个新值。它不会更改sandwich中的值。理解这一点是理解Python's name/reference model的基本要素。在

相关问题 更多 >