python - 拆分混合数据框的列

标签 python pandas

有一个数据框 df:

import pandas as pd
import numpy as np

df=pd.DataFrame(np.array([('x', 'y')] + [('y', 'x')] + 
                         list([0, np.nan]*2)), columns=['Col'])
df

df如何拆分成如下两列?:

   Col1 Col2
0   x   y
1   y   x
2   0   0
3   NaN NaN
4   0   0
5   NaN NaN

最佳答案

使用 list comprehension 将标量转换为元组:

df1 = pd.DataFrame([x if isinstance(x, tuple) else (x,x) for x in df['Col']], 
                   columns=['Col1','Col2'])
print (df1)
  Col1 Col2
0    x    y
1    y    x
2    0    0
3  NaN  NaN
4    0    0
5  NaN  NaN

更通用的解决方案:

lens = int(df['Col'].str.len().max())
df1 = pd.DataFrame([x if isinstance(x, tuple) else [x] * lens for x in df['Col']])

另一种解决方案,在大数据中速度较慢:

df1 = df['Col'].apply(pd.Series).ffill(axis=1)

性能:

df = pd.concat([df] * 1000, ignore_index=True)

In [51]: %%timeit
    ...: df1 = pd.DataFrame([x if isinstance(x, tuple) else (x,x) for x in df['Col']], 
    ...:                    columns=['Col1','Col2'])
    ...: 
2.42 ms ± 45.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [52]: %%timeit
    ...: df['Col'].apply(pd.Series).ffill(axis=1)
    ...: 
1 s ± 23.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

#coldspeed solution
In [53]: %%timeit
    ...: v = pd.to_numeric(df.Col, errors='coerce')
    ...: pd.DataFrame({
    ...:     'Col1': v.fillna(df.Col.str[0]), 
    ...:     'Col2': v.fillna(df.Col.str[-1])})
    ...: 
15.8 ms ± 472 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关于python - 拆分混合数据框的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53626636/

相关文章:

python - Tensorflow - 用我自己的图像测试 mnist 神经网络

csv - 未知列的 read_csv 转换器

python - 如何将 series.isin 与不同的集合一起用于不同的值?

python - 当需要用 python pandas 替换字符串时,如何有效避免替换子字符串?

python - 为什么对 Python 字符串函数采用不同的方法

python - 使用 Nginx+uWSGI 在 Flask 中提供动态媒体

python - 使用 tkinter Python 点击​​激活功能

python - 使用 pika 获取 RabbitMQ 队列的消费者总数

python-3.x - 如何按照我要求的方式取消旋转或堆叠 pandas 数据框?

python - Pandas 洗牌列值不起作用