我有这个人。列表:
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())
有没有办法填充其余的数据框?
答案 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)