我有一个数据框

df = pd.DataFrame({'≤8': {1: '3687 55.5', 2: '838 66.5', 3: '8905 66.9'},
 '9–13': {1: '2234 33.6', 2: '419 33.3', 3: '3362 25.2'},
 '14–15': {1: '290 4.4', 2: nan, 3: '473 3.6'},
 '16–17': {1: '194 2.9', 2: nan, 3: '252 1.9'},
 '18–20': {1: '185 2.8', 2: nan, 3: '184 1.4'},
 '≥21': {1: '52 0.8', 2: '0 0.0', 3: '144 1.1'}})

          ≤8       9–13    14–15    16–17    18–20      ≥21
1  3687 55.5  2234 33.6  290 4.4  194 2.9  185 2.8   52 0.8
2   838 66.5   419 33.3      NaN      NaN      NaN    0 0.0
3  8905 66.9  3362 25.2  473 3.6  252 1.9  184 1.4  144 1.1

我想把所有的列分成两列,所以有一个int列和一个float列(注意,我不想按类型分开,这些类型只是巧合).我已经将这些列拆分了,但我不知道如何将结果列表分配到新的列中.我还希望尽可能保持pythonic/pandonic,所以我不想单独循环每个列.

rev = gestation_cols.apply(lambda x: pd.Series([i for i in x.str.split(' ')]))

             ≤8          9–13       14–15       16–17       18–20         ≥21
0  [3687, 55.5]  [2234, 33.6]  [290, 4.4]  [194, 2.9]  [185, 2.8]   [52, 0.8]
1   [838, 66.5]   [419, 33.3]         NaN         NaN         NaN    [0, 0.0]
2  [8905, 66.9]  [3362, 25.2]  [473, 3.6]  [252, 1.9]  [184, 1.4]  [144, 1.1]
3  [1559, 48.6]  [1075, 33.5]  [209, 6.5]  [165, 5.1]  [173, 5.4]   [26, 0.8]

编辑:为清楚起见,我不想拆分单个列或单独拆分每个列.我知道我可以一个接一个地创建新的专栏,这只是一种糟糕的做法.我想把每一列都分成两列.

推荐答案

对于矢量版本,您可以临时使用stackstr.split:

df.stack().str.split().unstack()

输出:

             ≤8          9–13       14–15       16–17       18–20         ≥21
1  [3687, 55.5]  [2234, 33.6]  [290, 4.4]  [194, 2.9]  [185, 2.8]   [52, 0.8]
2   [838, 66.5]   [419, 33.3]         NaN         NaN         NaN    [0, 0.0]
3  [8905, 66.9]  [3362, 25.2]  [473, 3.6]  [252, 1.9]  [184, 1.4]  [144, 1.1]

要使多个列使用expand=True参数,您将得到一个多索引,然后可以根据需要进行修改:

df.stack().str.split(expand=True).unstack()

输出:

      0                                  1                             
     ≤8  9–13 14–15 16–17 18–20  ≥21    ≤8  9–13 14–15 16–17 18–20  ≥21
1  3687  2234   290   194   185   52  55.5  33.6   4.4   2.9   2.8  0.8
2   838   419   NaN   NaN   NaN    0  66.5  33.3   NaN   NaN   NaN  0.0
3  8905  3362   473   252   184  144  66.9  25.2   3.6   1.9   1.4  1.1

reorganizing the order

(df.stack()
   .str.split(expand=True)
   .unstack()
   .swaplevel(axis=1)
   [df.columns]
)

输出:

     ≤8        9–13       14–15      16–17      18–20       ≥21     
      0     1     0     1     0    1     0    1     0    1    0    1
1  3687  55.5  2234  33.6   290  4.4   194  2.9   185  2.8   52  0.8
2   838  66.5   419  33.3   NaN  NaN   NaN  NaN   NaN  NaN    0  0.0
3  8905  66.9  3362  25.2   473  3.6   252  1.9   184  1.4  144  1.1

Python相关问答推荐

如何计算两极打印机中 * 所有列 * 的出现次数?

Python多处理:当我在一个巨大的pandas数据框架上启动许多进程时,程序就会陷入困境

如果条件为真,则Groupby.mean()

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

. str.替换pandas.series的方法未按预期工作

在Pandas DataFrame操作中用链接替换'方法的更有效方法

无法通过python-jira访问jira工作日志(log)中的 comments

在Python中管理打开对话框

如何使用数组的最小条目拆分数组

Python虚拟环境的轻量级使用

numpy卷积与有效

pyscript中的压痕问题

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

如何从pandas的rame类继承并使用filepath实例化

在Python中计算连续天数

以逻辑方式获取自己的pyproject.toml依赖项

在Django中重命名我的表后,旧表中的项目不会被移动或删除

使用pythonminidom过滤XML文件

当lambda函数作为参数传递时,pyo3执行

如何将django url参数传递给模板&S url方法?