当前位置: 首页 > 知识库问答 >
问题:

将类别字符串拆分为特定的Dataframe列[重复]

麻昌翰
2023-03-14

我有以下类别的< code>Dataframe列:

    data = {'People': ['John','Mary','Andy','April'], 
             'Class': ['Math, Science','English, Math, Science','Math, Science','Science, English, Math']}
    
    df = pd.DataFrame(data, columns = ['People', 'Class'])

如何创建新列并将数据转换为:

> | People | Math | Science | English |
> ------------------------------------- 
> | John   | Math | Science |         | 
> | Mary   | Math | Science | English | 
> | Andy   | Math | Science |         |
> | April  | Math | Science | English |

共有3个答案

伍玮
2023-03-14

这是一个解决方案,

# Strip-out white spaces before `,\s+`, use dummies to create categorical variable

df = df.set_index('People')

dummies = (
    df.Class.str.replace(',\s+', ",", regex=True)
        .str.get_dummies(sep=",")
)

   English  Math  Science
0        0     1        1
1        1     1        1
2        0     1        1
3        1     1        1

# Create a "hash map" to substitute categorical data
replace_ = {i : j for i, j in enumerate(dummies.columns, 1)}

# multiply keys with & replace to fill in the column values.
dummies.mul(list(replace_.keys())).replace(replace_)
        English  Math  Science
People                        
John          0  Math  Science
Mary    English  Math  Science
Andy          0  Math  Science
April   English  Math  Science
戚建白
2023-03-14

以下代码可能对您有所帮助

columns = set([x for lst in df['Class'] for x in lst.replace(" ", "").split(",") ])
for col in columns:
  df[col] = ""*len(df)

for i, val in enumerate(df["Class"]):
  cl = val.replace(" ", "").split(",")
  print(cl)
  for value in cl:
    df.loc[i][value] = value
df.drop('Class', axis=1, inplace=True)

输出:

    People  Science English Math
0   John    Science         Math
1   Mary    Science English Math
2   Andy    Science         Math
3   April   Science English Math
龙俭
2023-03-14
  • 使用.get_dummies获取 Class 列的 1 和 0 表
  • 使用 np.where 将 1 替换为列名,将 0 替换为空字符串。
  • 断续器Class.str.get_dummies(', ').apply(lambda x: np.其中(x == 1, x.name, '')) 创建一个单独的数据帧,我们使用 .join 将其合并回 df
  • .删除不需要的“”列。
import pandas as pd
import numpy as np

updated = df.join(df.Class.str.get_dummies(', ').apply(lambda x: np.where(x == 1, x.name, ''))).drop(columns=['Class'])

# display(updated)
  People  English  Math  Science
0   John           Math  Science
1   Mary  English  Math  Science
2   Andy           Math  Science
3  April  English  Math  Science
 类似资料:
  • 理想情况下,我希望这些新列也被命名。

  • 我不知道如何使用来实现拆分行单元格的目标。我可以使用添加一个新列,并用填充它。有什么想法吗?

  • 问题内容: 我想将字符串“ aaaabbbccccaaddddcfggghhhh”拆分为“ aaaa”,“ bbb”,“ cccc”。“ aa”,“ dddd”,“ c”,“ f”等。 我尝试了这个: 但这会吃掉一个字符,因此使用上面的正则表达式我得到“ aaa”,而我希望它成为“ aaaa”作为第一个字符串。 我该如何实现? 问题答案: 试试这个: 说明:我们想将字符串分成相同字符的组,因此我们

  • 我有这样的绳子: 这是一个文本[空格]这也是文本[空格]更多的文本[空格]这里的文本 我的目标是创建这样的数组: 或者像这样 我尝试过这样拆分它。拆分('['),但这并不是我想要的

  • 问题内容: 我对Regex的经验不足,但是我已经阅读了很多。假设有一个字符串,我想要一个列表,该列表的字符串分为两个部分。我的方法是让一个小组检查是否是数字,然后检查该小组是否重复。像这样 我认为基本上可以检查“ digit”或“ digit +”是否相同。我认为这可以满足我的要求。 问题答案: 用途:

  • 问题内容: 我需要在SQL Server 2012中将一列中的字符串拆分为一个字符,并将每个字符串拆分成它自己的列。 例如:如果我有一个栏,我需要把它拆分成,,,,,与每个这些转化为自己列。 要拆分的列的长度可能会有所不同,因此我需要使其尽可能地动态。 问题答案: 您可以这样做: 输出: 这是动态版本: