[英]Python pandas.read_csv split column into multiple new columns using comma to separate
我使用pandas.read_csv加载文件。
我已将文件存储到变量中。 第一列是一系列数字,中间用逗号(,)分隔,我想将这些数字分割,然后将每个数字放到新列中。
我似乎找不到pandas.dataframe的写入功能。
旁注我希望使用其他库来加载文件,但是pandas提供了我需要的其他一些功能。
我的代码:
Data = pandas.read_csv(pathFile,header=None)
这样做: print Data
给我:
0 1 2 ...
0 [2014, 8, 26, 5, 30, 0.0] 0 0.25 ...
(如您所见,它是一个日期)
问题:如何分割/分隔每个数字并将其保存在新数组中
ps我正在尝试实现matlab方法datevec()
所做的相同操作
如果CSV数据看起来像
"[2014, 8, 26, 5, 30, 0.0]",0,0.25
然后
import pandas as pd
import json
df = pd.read_csv('data', header=None)
dates, df = df[0], df.iloc[:, 1:]
df = pd.concat([df, dates.apply(lambda x: pd.Series(json.loads(x)))], axis=1,
ignore_index=True)
print(df)
产量
0 1 2 3 4 5 6 7
0 0 0.25 2014 8 26 5 30 0
将值解析为数字值。
这个怎么运作:
dates, df = df[0], df.iloc[:, 1:]
剥离第一列,然后将df
重新分配给DataFrame的其余部分:
In [217]: dates
Out[217]:
0 [2014, 8, 26, 5, 30, 0.0]
Name: 0, dtype: object
dates
包含字符串:
In [218]: dates.iloc[0]
Out[218]: '[2014, 8, 26, 5, 30, 0.0]'
我们可以使用json.loads
将它们转换为列表:
In [219]: import json
In [220]: json.loads(dates.iloc[0])
Out[220]: [2014, 8, 26, 5, 30, 0.0]
In [221]: type(json.loads(dates.iloc[0]))
Out[221]: list
我们可以使用apply
对每一行dates
执行此操作:
In [222]: dates.apply(lambda x: pd.Series(json.loads(x)))
Out[222]:
0 1 2 3 4 5
0 2014 8 26 5 30 0
通过在上面创建lambda
,返回一个Series, apply
将返回一个DataFrame,Series的索引成为该DataFrame的列索引。
现在我们可以使用pd.concat
将这个DataFrame与df
连接起来:
In [228]: df = pd.concat([df, dates.apply(lambda x: pd.Series(json.loads(x)))], axis=1, ignore_index=True)
In [229]: df
Out[229]:
0 1 2 3 4 5 6 7
0 0 0.25 2014 8 26 5 30 0
In [230]: df.dtypes
Out[230]:
0 int64
1 float64
2 float64
3 float64
4 float64
5 float64
6 float64
7 float64
dtype: object
怎么样
df
# datestr
#0 2014, 8, 26, 5, 30, 0.0
#1 2014, 8, 26, 5, 30, 0.0
#2 2014, 8, 26, 5, 30, 0.0
#3 2014, 8, 26, 5, 30, 0.0
#4 2014, 8, 26, 5, 30, 0.0
# each entry is a string
df.datestr[0]
#'2014, 8, 26, 5, 30, 0.0'
然后
date_order = ('year', 'month','day','hour','minute','sec') # order matters here, should match the datestr column
for i,col in enumerate( date_order):
df[col] = df.datestr.map( lambda x: x.split(',')[i].strip() )
#df
# datestr year month day hour minute sec
#0 2014, 8, 26, 5, 30, 0.0 2014 8 26 5 30 0.0
#1 2014, 8, 26, 5, 30, 0.0 2014 8 26 5 30 0.0
#2 2014, 8, 26, 5, 30, 0.0 2014 8 26 5 30 0.0
#3 2014, 8, 26, 5, 30, 0.0 2014 8 26 5 30 0.0
#4 2014, 8, 26, 5, 30, 0.0 2014 8 26 5 30 0.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.