【问题标题】:pandas: Split and convert series of alphanumeric texts to columns and rowspandas:将一系列字母数字文本拆分并转换为列和行
【发布时间】:2020-10-19 21:06:39
【问题描述】:

当前数据框:我有一个 pandas 数据框,其中每个员工都有一个文本代码(所有代码都以 T 开头)和代码旁边的相关频率。所有文本代码都有 8 个字符。

+----------+-------------------------------------------------------------+
|  emp_id  |   text                                                      |
+----------+-------------------------------------------------------------+
|   E0001  | [T0431516,-8,T0401531,-12,T0517519,12]                      |
|   E0002  | [T0701540,-1,T0431516,-2]                                   |
|   E0003  | [T0517519,-1,T0421531,-7,T0516319,9,T0500371,-6,T0309711,-3]|
|   E0004  | [T0516319,-3]                                               |
|   E0005  | [T0431516,2]                                                |
+----------+-------------------------------------------------------------+

预期的数据框:我正在尝试将数据框中的文本代码作为单独的列显示,如果员工对该代码有频率,则填充频率否则为 0。

+----------+----------------------------------------------------------------------------------------+
|  emp_id  | T0431516 | T0401531 | T0517519 | T0701540 | T0421531 |  T0516319 | T0500371 | T0309711 |                                      
+----------+----------------------------------------------------------------------------------------+
|   E0001  | -8       | -12      | 12       | 0        | 0        | 0         | 0        | 0        |
|   E0002  | -2       | 0        | 0        | -1       | 0        | 0         | 0        | 0        |
|   E0003  | 0        | 0        | -1       | 0        | -7       | 9         | -6       | -3       |
|   E0004  | 0        | 0        | 0        | 0        | 0        | -3        | 0        | 0        |
|   E0005  | 2        | 0        | 0        | 0        | 0        | 0         | 0        | 0        |
+----------+----------------------------------------------------------------------------------------+

样本数据

pd.DataFrame({'emp_id' : {0: 'E0001', 1: 'E0002', 2: 'E0003', 3: 'E0004', 4: 'E0005'},
                'text' :  {0: '[T0431516,-8,T0401531,-12,T0517519,12]', 1: '[T0701540,-1,T0431516,-2]', 2: '[T0517519,-1,T0421531,-7,T0516319,9,T0500371,-6,T0309711,-3]', 3: '[T0516319,-3]', 4: '[T0431516,2]'}
                })

所以,到目前为止,我的尝试都没有成功。非常感谢任何指针/帮助!

【问题讨论】:

  • 整个数据集中的代码都是以T开头的吗?
  • 顺便说一句,这些不是有效的列表
  • 这个问题本身很有趣,但是手动将那个数据表解析成一个dataframe实在是太痛苦了……请看一下本站share dataframes的方式。
  • @BillHuang 我的错,我完全忘记了!请立即检查。

标签: python pandas parsing nlp text-mining


【解决方案1】:

您可以explode 数据框然后创建一个pivot_table

df = pd.DataFrame({'emp_id' : ['E0001', 'E0002', 'E0003', 'E0004', 'E0005'],
                  'text' : [['T0431516',-8,'T0401531',-12,'T0517519',12],
                 ['T0701540',-1,'T0431516',-2],['T0517519',-1,'T0421531',-7,'T0516319',9,'T0500371',-6,'T0309711',-3],
                 ['T0516319',-3], ['T0431516',2]]})
df = df.explode('text')
df['freq'] = df['text'].shift(-1)
df = df[df['text'].str[0] == 'T']
df['freq'] = df['freq'].astype(int)
df = pd.pivot_table(df, index='emp_id', columns='text', values='freq',aggfunc = 'sum').fillna(0).astype(int)
df
Out[1]: 
text    T0309711  T0401531  T0421531  T0431516  T0500371  T0516319  T0517519  \
emp_id                                                                         
E0001          0       -12         0        -8         0         0        12   
E0002          0         0         0        -2         0         0         0   
E0003         -3         0        -7         0        -6         9        -1   
E0004          0         0         0         0         0        -3         0   
E0005          0         0         0         2         0         0         0   

text    T0701540  
emp_id            
E0001          0  
E0002         -1  
E0003          0  
E0004          0  
E0005          0  

【讨论】:

  • 不完全确定为什么“explode”功能无法处理我前段时间上传的示例数据。有什么想法吗?
  • @rudr,也许您需要将其转换为列表?
  • 没有错误,好像只是转换成列表后什么都没做。
  • @Rudr 您是否正在为所有代码行设置结果?例如df = df.explode('text') 而不是 df.explode('text')。还要检查这行代码:df = df[df['text'].str[0] == 'T']。在您的实际数据中,字符串是否以T 开头?
  • 是的,基础数据存在问题。在修复它们并转换为列表后它工作得很好。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2018-02-02
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
相关资源
最近更新 更多