繁体   English   中英

如何将可变大小的基于字符串的列拆分为 Pandas DataFrame 中的多列?

[英]How to split variable sized string-based column into multiple columns in Pandas DataFrame?

我有一个 pandas DataFrame 形式为:

A      B       C     D
A1     6       7.5   NaN
A1     4       23.8  <D1 0.0 6.5 12 4, D2 1.0 4 3.5 1>
A2     7       11.9  <D1 2.0 7.5 10 2, D3 7.5 4.2 13.5 4> 
A3    11       0.8   <D2 2.0 7.5 10 2, D3 7.5 4.2 13.5 4, D4 2.0 7.5 10 2, D5 7.5 4.2 13.5 4>

D列是一个原始字符串列,每个条目中有多个类别。 条目的值是通过将每个类别的最后两个值相除来计算的。 例如,在第 2 行:

D1 = 12/4 = 3
D2 = 3.5/1 = 3.5

我需要根据其类别拆分D列并将它们加入我的 DataFrame。 问题是该列是动态的,单个条目中可以包含近 35-40 个类别。 目前,我所做的只是通过迭代所有行的蛮力方法,这对于大型数据集来说非常慢。 有人可以帮帮我吗?

预期结果

A      B       C     D1  D2  D3  D4  D5
A1     6       7.5   NaN NaN NaN NaN NaN
A1     4       23.8  3.0 3.5 NaN NaN NaN
A2     7       11.9  5.0 NaN 3.4 NaN NaN 
A3    11       0.8   NaN 5.0 3.4 5.0 3.4

利用:

d = df['D'].str.extractall(r'(D\d+).*?([\d.]+)\s([\d.]+)(?:,|\>)')
d = d.droplevel(1).set_index(0, append=True).astype(float)
d = df.join(d[1].div(d[2]).round(1).unstack()).drop('D', 1)

细节:

使用Series.str.extractallregex模式指定的D列中提取所有捕获组。 您可以在here测试regex模式。

print(d)
          0     1  2 # --> capture groups
  match             
1 0      D1    12  4
  1      D2   3.5  1
2 0      D1    10  2
  1      D3  13.5  4
3 0      D2    10  2
  1      D3  13.5  4
  2      D4    10  2
  3      D5  13.5  4

使用DataFrame.droplevel + set_index和可选参数append=True来删除未使用的级别,并使用 append 一个新的 datafarme 索引。

print(d)
         1    2
  0            
1 D1  12.0  4.0
  D2   3.5  1.0
2 D1  10.0  2.0
  D3  13.5  4.0
3 D2  10.0  2.0
  D3  13.5  4.0
  D4  10.0  2.0
  D5  13.5  4.0

使用Series.div1列除以2并使用Series.round舍入值,然后使用Series.unstack重塑 dataframe,然后使用DataFrame.join加入新的df

print(d)
    A   B     C   D1   D2   D3   D4   D5
0  A1   6   7.5  NaN  NaN  NaN  NaN  NaN
1  A1   4  23.8  3.0  3.5  NaN  NaN  NaN
2  A2   7  11.9  5.0  NaN  3.4  NaN  NaN
3  A3  11   0.8  NaN  5.0  3.4  5.0  3.4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM