从字符串列表创建pandas数据帧

时间:2017-02-11 03:03:38

标签: python pandas

我有这个人。列表:

list_vals = ['col_a col_B col_C', '12.0 34.0 10.0', '15.0 111.0 23']

如何将其转换为pandas数据框?

我可以这样开始:

df = pd.DataFrame(columns=list_vals[0].split())

有没有办法填充其余的数据框?

3 个答案:

答案 0 :(得分:10)

您可以使用io.StringIO将字符串反馈到read_csv

In [23]: pd.read_csv(io.StringIO('\n'.join(list_vals)), delim_whitespace=True)
Out[23]: 
   col_a  col_B  col_C
0   12.0   34.0   10.0
1   15.0  111.0   23.0

这样做的好处是它会自动执行pandas在读取普通csv时会执行的类型解释 - 列是浮点数:

In [24]: _.dtypes
Out[24]: 
col_a    float64
col_B    float64
col_C    float64
dtype: object

虽然您可以直接将列表提供给DataFrame构造函数,但所有内容都会保留字符串:

In [21]: pd.DataFrame(columns=list_vals[0].split(), 
                      data=[row.split() for row in list_vals[1:]])
Out[21]: 
  col_a  col_B col_C
0  12.0   34.0  10.0
1  15.0  111.0    23

In [22]: _.dtypes
Out[22]: 
col_a    object
col_B    object
col_C    object
dtype: object

我们当然可以添加dtype=float来修复此问题,但我们可能会使用read_csv方法以常规方式处理的混合类型,这里我们必须手动完成

答案 1 :(得分:1)

您可以通过将数据转换为dict来实现,例如:

>>> pd.DataFrame({a: b for a, *b in (zip(*map(str.split, list_vals)))})
   col_B col_C col_a
0   34.0  10.0  12.0
1  111.0    23  15.0

或者使用原始订单:

>>> pd.DataFrame({a: b for a, *b in (zip(*map(str.split, list_vals)))},
...              columns=list_vals[0].split())
  col_a  col_B col_C
0  12.0   34.0  10.0
1  15.0  111.0    23

答案 2 :(得分:1)

您可以将其读为numpy structured array,然后将其传递给熊猫。如果您还需要使用numpy并在读取之前定义了数据类型,这将很有用(否则,与熊猫相比,numpy可以退一步使用)。

import numpy as np
import pandas as pd

list_vals = ['col_a col_B col_C', '12.0 34.0 10.0', '15.0 111.0 23']

# Gather names from first line, assume all column types are 'd' (i.e. float)
list_dtype = np.dtype([(name, 'd') for name in list_vals[0].split()])

# Create a numpy structured array
ar = np.fromiter((tuple(x.split()) for x in list_vals[1:]), dtype=list_dtype)

# Now convert it to a pandas DataFrame
dat = pd.DataFrame(ar)