首页 > 解决方案 > 如何提取数据框中出现的字符串?

问题描述

您好,有问题请帮忙:

我有一个这样的数据框:


data = {'col_1': [13,22,45], 'col_2': ['max jo;max3;max;maxT za;max jo;',
        'max jo;maxF zero;max jo;maxD ;maxT;max jo;',
        'wmaxT za;maxF;maxbing;maxT ze;max xw;',]}
df1 = pd.DataFrame.from_dict(data)
+----+-------------------------------------------+
|col1|               col2                        |
+----+------+-------+----------------------------+
| 13 | max jo;max3;max;maxT za;max jo'           |
| 22 | max jo;maxF zero;max jo;maxD ;maxT;max jo |
| 45 |  wmaxT za;maxF;maxbing;maxT za;max xw     |
+---+------+-------+-----------------------------+

我首先用“col2”提取一个集合

我被阻止了,因为我在 col_1 上找不到事件??

col = df1["col_2"].str.findall("\w+")

unique = set()

for x in col:
    unique.update(x)

我想提取 col2 中每次出现的所有代码“col1”

像这样的数据框:

+-----------+-------------------------------+
|col1       |               col2            |
+----+------+-------+-----------------------+
| max jo    | 13,22                         |
| max3      | 3                             |
| maxT za   | 13,45                         |
|  ...         ...                          |
+---+------+-------+------------------------+

标签: pythonpandasdataframe

解决方案


我认为您需要拆分;以避免使用空格拆分值,将其整形stack并聚合sets 转换为字符串:

col = (df1.set_index('col_1')["col_2"]
          .str.strip(";'")
          .str.split(";", expand=True)
          .stack()
          .str.strip()
          .reset_index(name='new1')
          .groupby('new1')['col_1']
          .agg(lambda x: ','.join(set(x.astype(str))))
          .reset_index(name='new2'))
print (col)
         new1      new2
1         max        13
2      max jo     13,22
3      max xw        45
4        max3        13
5        maxD        22
6        maxF        45
7   maxF zero        22
8        maxT        22
9     maxT za        13
10    maxT ze        45
11    maxbing        45
12   wmaxT za        45

您可以使用自定义功能,例如:

def extract(df, col1,col2):
     new = (df.set_index(col1)[col2] 
              .str.strip(";'") 
              .str.split(";", expand=True) 
              .stack() 
              .str.strip() 
              .reset_index(name='new1') 
              .groupby('new1')[col1] 
              .agg(lambda x: ','.join(set(x.astype(str)))) 
              .reset_index(name='new2')) 
     return new
 
    
df1 = extract(df1, 'col_1','col_2')

推荐阅读