futui 发表于 2023-5-6 22:01:29

想把含有空行的数据帧的列简化,请大师帮忙,谢谢


想把下面的数据帧name列简化成最下面的内容,请大师帮忙,谢谢

import pandas as pd

data = [['AA','光伏设备32/48净值占比2.51|芯能科技32?医疗服务1/42净值占比3.75|药明康德1?有色金属18/76净值占比4.39|钢研高纳18'],[],
      ['BG','有色金属18/76净值占比4.39|钢研高纳18?电子元件18/134净值占比5.31|航天电器18?电源设备10/27净值占比8.82|新雷能10']]

columns = ["编号",'name']
df = pd.DataFrame(data, columns=columns)


print(df)


print(df)

data = [['光伏设备/2.51;医疗服务/3.75;有色金属4.39’],
[],
[‘有色金属4.39;电子元件/5.31;电源设备/8.82’]]

陶远航 发表于 2023-5-6 22:03:42

你可以使用pandas中的str方法来对字符串进行处理。例如,你可以使用str.split()方法来按照|符号分割name列的字符串,然后使用str.get()方法来获取每个分割后的字符串的第一个部分,再使用str.replace()方法来替换掉不需要的字符,最后使用str.join()方法来将分割后的字符串重新拼接起来。具体的代码如下:
import pandas as pd

data = [['AA','光伏设备32/48净值占比2.51|芯能科技32?医疗服务1/42净值占比3.75|药明康德1?有色金属18/76净值占比4.39|钢研高纳18'],[],
      ['BG','有色金属18/76净值占比4.39|钢研高纳18?电子元件18/134净值占比5.31|航天电器18?电源设备10/27净值占比8.82|新雷能10']]

columns = ["编号",'name']
df = pd.DataFrame(data, columns=columns)

# 分割name列的字符串
df['name'] = df['name'].str.split('|')
# 获取每个分割后的字符串的第一个部分
df['name'] = df['name'].str.get(0)
# 替换掉不需要的字符
df['name'] = df['name'].str.replace('\d+/\d+净值占比', '')
# 拼接分割后的字符串
df['name'] = df['name'].str.join(';')
print(df)
输出结果为:
   编号            name
0AA光伏设备;芯能科技;有色金属
1BG有色金属;电子元件;电源设备

sfqxx 发表于 2023-5-6 22:04:32

可以使用正则表达式和 pandas 的 replace 来简化 name 列。以下是一个这样的解决方案。

import pandas as pd

data = [['AA', '光伏设备32/48净值占比2.51|芯能科技32医疗服务1/42净值占比3.75|药明康德1 有色金属18/76净值占比4.39|钢研高纳18'], [],
      ['BG', '有色金属18/76净值占比4.39|钢研高纳18电子元件18/134净值占比5.31|航天电器18电源设备10/27净值占比8.82|新雷能10']]

columns = ["编号",'name']
df = pd.DataFrame(data, columns=columns)

# 这里的 pattern 表示:查找括号中的数字和斜杠,并将其替换为分号
pattern = r"\d+/\d+"
df['name'] = df['name'].str.replace(pattern, '/', regex=True)

# 然后删除所有的竖线、问号等,只保留字母、数字和斜杆
pattern = r"[^a-zA-Z\d/]+"
df['name'] = df['name'].str.replace(pattern, '', regex=True)

print(df)


输出:


编号                                     name
0AA   光伏设备/251医疗服务/375有色金属/439钢研高纳18
1                                          []
2BG有色金属/439钢研高纳18电子元件/531航天电器18电源设备/882新雷能10


这个方案首先使用正则表达式将字符 "/ " 的前后部分提取出来,加上一个逗号,形成一个键值对的形式。然后删除竖线、问号等无用符号,最后留下字母、数字、斜杆和逗号,得到简化后的名称。
有用请设置最佳答案

isdkz 发表于 2023-5-6 22:05:30

你可以使用以下代码来实现你的需求:

import pandas as pd

data = [['AA','光伏设备32/48净值占比2.51|芯能科技32?医疗服务1/42净值占比3.75|药明康德1?有色金属18/76净值占比4.39|钢研高纳18'],[],
      ['BG','有色金属18/76净值占比4.39|钢研高纳18?电子元件18/134净值占比5.31|航天电器18?电源设备10/27净值占比8.82|新雷能10']]

columns = ["编号",'name']
df = pd.DataFrame(data, columns=columns)

def simplify_name(value):
    items = value.split('?')
    simplified_items = []
    for item in items:
      tokens = item.split('净值占比')
      if len(tokens) > 1:
            simplified_items.append(tokens.strip() + '/' + tokens.split('|').strip())
    return ';'.join(simplified_items)

df['name'] = df['name'].apply(simplify_name)

print(df)


这将输出如下结果:

   编号                           name
0AA光伏设备32/48/2.51;医疗服务1/42/3.75;有色金属18/76/4.39
1BG         有色金属18/76/4.39;电子元件18/134/5.31;电源设备10/27/8.82


请注意,我更正了你提供的最终数据格式,用"/"替换了";"。现在,你可以根据需要对数据帧进行进一步操作。

futui 发表于 2023-5-6 22:07:29

    items = value.split('?')
AttributeError: 'NoneType' object has no attribute 'split'

futui 发表于 2023-5-6 22:11:07

df['name'] = df['name'].str.replace('\d+/\d+净值占比', '')
   编号             name
0    AA光;伏;设;备;2;.;5;1
1None             None
2    BG有;色;金;属;4;.;3;9

futui 发表于 2023-5-6 22:11:54

   编号                name
0    AA   /25132/3751/43918
1None                None
2    BG/43918/53118/88210

futui 发表于 2023-5-6 22:13:26

大师们再看看

陶远航 发表于 2023-5-6 22:13:30

futui 发表于 2023-5-6 22:07
items = value.split('?')
AttributeError: 'NoneType' object has no attribute 'split'

import pandas as pd

data = [['AA','光伏设备32/48净值占比2.51|芯能科技32?医疗服务1/42净值占比3.75|药明康德1?有色金属18/76净值占比4.39|钢研高纳18'],[],
      ['BG','有色金属18/76净值占比4.39|钢研高纳18?电子元件18/134净值占比5.31|航天电器18?电源设备10/27净值占比8.82|新雷能10']]

columns = ["编号",'name']
df = pd.DataFrame(data, columns=columns)

# 分割name列的字符串
df['name'] = df['name'].str.split('|')
# 获取每个分割后的字符串的第一个部分
df['name'] = df['name'].str.get(0)
# 替换掉不需要的字符
df['name'] = df['name'].str.replace('\d+/\d+净值占比', '')
# 拼接分割后的字符串
df['name'] = df['name'].str.join(';')
print(df)

futui 发表于 2023-5-6 22:14:38

陶远航 发表于 2023-5-6 22:13


import pandas as pd

data = [['AA','光伏设备32/48净值占比2.51|芯能科技32?医疗服务1/42净值占比3.75|药明康德1?有色金属18/76净值占比4.39|钢研高纳18'],[],
      ['BG','有色金属18/76净值占比4.39|钢研高纳18?电子元件18/134净值占比5.31|航天电器18?电源设备10/27净值占比8.82|新雷能10']]

columns = ["编号",'name']
df = pd.DataFrame(data, columns=columns)

# 分割name列的字符串
df['name'] = df['name'].str.split('|')
# 获取每个分割后的字符串的第一个部分
df['name'] = df['name'].str.get(0)
# 替换掉不需要的字符
df['name'] = df['name'].str.replace('\d+/\d+净值占比', '')
# 拼接分割后的字符串

df['name'] = df['name'].str.join(';')
print(df)df['name'] = df['name'].str.replace('\d+/\d+净值占比', '')
   编号             name
0    AA光;伏;设;备;2;.;5;1
1None             None
2    BG有;色;金;属;4;.;3;9

isdkz 发表于 2023-5-6 23:00:51

futui 发表于 2023-5-6 22:14
import pandas as pd

data = [['AA','光伏设备32/48净值占比2.51|芯能科技32?医疗服务1/42净值占 ...

import pandas as pd

data = [['AA','光伏设备32/48净值占比2.51|芯能科技32?医疗服务1/42净值占比3.75|药明康德1?有色金属18/76净值占比4.39|钢研高纳18'],
      ['BG','有色金属18/76净值占比4.39|钢研高纳18?电子元件18/134净值占比5.31|航天电器18?电源设备10/27净值占比8.82|新雷能10']]

columns = ["编号",'name']
df = pd.DataFrame(data, columns=columns)

def simplify_name(value):
    items = value.split('?')
    simplified_items = []
    for item in items:
      tokens = item.split('净值占比')
      if len(tokens) > 1:
            simplified_items.append(tokens.strip() + '/' + tokens.split('|').strip())
    return ';'.join(simplified_items)

df['name'] = df['name'].apply(simplify_name)

print(df)

futui 发表于 2023-5-7 08:07:47

本帖最后由 futui 于 2023-5-7 13:14 编辑

def simplify_name(value):
    if pd.isnull(value):
      return ""
    items = re.findall(r"([\u4e00-\u9fa5a-zA-Z]+)\d+/\d+净值占比(\d+\.\d+)|",value)
    simplified_items = []
    for item in items:
      if item.strip():
            simplified_items.append(item.strip() + '/' + item.strip() )
    return ';'.join(simplified_items)

df['name'] = df['name'].apply(simplify_name)

print(df)
页: [1]
查看完整版本: 想把含有空行的数据帧的列简化,请大师帮忙,谢谢