在python中解析多个系列并重命名标题
我的价格数据是这样的 你会看到在python中解析多个系列并重命名标题,python,pandas,import,Python,Pandas,Import,我的价格数据是这样的 你会看到 时间序列的起点和终点因两列和两列而不同 有一个空单元格需要填写“date_23340 KS Equity”或其他内容 我喜欢通过equities高效地导入这个巨大的文件,最重要的是,将空单元格的名称更改为“date_equities’name”。我怎样才能将它划分为由日期和值组成的单独数据帧 如果您对pandas从文件的第一行生成的自动头不满意,您可以跳过它,告诉pandas不要生成头并提供自己的头。 除此之外,您还可以选择要读取的列: df_1 = pd.rea
我喜欢通过equities高效地导入这个巨大的文件,最重要的是,将空单元格的名称更改为“date_equities’name”。我怎样才能将它划分为由日期和值组成的单独数据帧 如果您对pandas从文件的第一行生成的自动头不满意,您可以跳过它,告诉pandas不要生成头并提供自己的头。 除此之外,您还可以选择要读取的列:
df_1 = pd.read_csv("price.csv", usecols = [0,1], skiprows=1, header=['date', 'equity'])
df_2 = pd.read_csv("price.csv", usecols = [2,3], skiprows=1, header=['date', 'equity'])
首先按shift列名创建
系列
,按第一个空格拆分并追加日期
,最后一个过滤器仅未命名
索引值和重命名
列名:
s = df.columns.to_series().shift(-1).str.split(n=1).str[0] + ' Date'
s = s[s.index.str.startswith('Unnamed')]
print (s)
Unnamed: 0 233740 Date
Unnamed: 2 233160 Date
dtype: object
df = df.rename(columns=s)
print (df)
233740 Date 233740 KS Equity 233160 Date 233160 KS Equity
0 2015-12-17 10330.0 2017-08-31 10460.0
1 2015-12-18 10710.0 2017-09-01 10815.0
2 2015-12-21 10720.0 2017-09-04 10835.0
3 2015-12-22 10495.0 2017-09-05 10660.0
4 2015-12-23 10425.0 2017-09-06 10535.0
如果需要从所有数据中创建2或3列,请首先创建多索引,然后调用:
编辑:
多个不同标题的解决方案:
#create dummy data
df1 = df.copy()
df1.columns = ['Unnamed: 4','233 JP Equity','Unnamed: 6','235 JP Equity']
df = df.join(df1)
print (df)
Unnamed: 0 233740 KS Equity Unnamed: 2 233160 KS Equity Unnamed: 4 \
0 2015-12-17 10330.0 2017-08-31 10460.0 2015-12-17
1 2015-12-18 10710.0 2017-09-01 10815.0 2015-12-18
2 2015-12-21 10720.0 2017-09-04 10835.0 2015-12-21
3 2015-12-22 10495.0 2017-09-05 10660.0 2015-12-22
4 2015-12-23 10425.0 2017-09-06 10535.0 2015-12-23
233 JP Equity Unnamed: 6 235 JP Equity
0 10330.0 2017-08-31 10460.0
1 10710.0 2017-09-01 10815.0
2 10720.0 2017-09-04 10835.0
3 10495.0 2017-09-05 10660.0
4 10425.0 2017-09-06 10535.0
s = df.columns.to_series().shift(-1) + ' Date'
s = s[s.index.str.startswith('Unnamed')]
print (s)
Unnamed: 0 233740 KS Equity Date
Unnamed: 2 233160 KS Equity Date
Unnamed: 4 233 JP Equity Date
Unnamed: 6 235 JP Equity Date
dtype: object
df = df.rename(columns=s)
在列表理解groupby first number中,同时创建dataetimeindex和concat。最后通过stack
和unstack
对移除NaN
s进行整形:
f = lambda x: x.split(' ',1)[1]
df = pd.concat([x.set_index(x.columns[0]).rename(columns=f) for i, x
in df.groupby(df.columns.str.split(n=1).str[0], axis=1)], 1).stack().unstack()
print (df)
JP Equity KS Equity
2015-12-17 10330.0 10330.0
2015-12-18 10710.0 10710.0
2015-12-21 10720.0 10720.0
2015-12-22 10495.0 10495.0
2015-12-23 10425.0 10425.0
2017-08-31 10460.0 10460.0
2017-09-01 10815.0 10815.0
2017-09-04 10835.0 10835.0
2017-09-05 10660.0 10660.0
2017-09-06 10535.0 10535.0
非常感谢你,@jezrael,在制作新的列标题之前,你是对的。而且效果很好。然而,有一个小的缓存,不是所有股票都以“KS股票”结尾。数据中也有一些“JP股票”,因此结果是,
val Date JP Equity KS Equity 0 069500 2013-01-02 NaN 27130.0 1 069660 2013-01-02 NaN 27110.0 2 091160 2013-01-02 NaN 16140.0 3 091170 2013-01-02 NaN 7540.0 4 091180 2013-01-02 NaN 20310.0
也许我需要多做一点帮助……谢谢很多:)@HannahLee-当然,给我一些时间。@HannahLee-如果KS股票
和JP股票
,预期的产出是多少?3列?
#create dummy data
df1 = df.copy()
df1.columns = ['Unnamed: 4','233 JP Equity','Unnamed: 6','235 JP Equity']
df = df.join(df1)
print (df)
Unnamed: 0 233740 KS Equity Unnamed: 2 233160 KS Equity Unnamed: 4 \
0 2015-12-17 10330.0 2017-08-31 10460.0 2015-12-17
1 2015-12-18 10710.0 2017-09-01 10815.0 2015-12-18
2 2015-12-21 10720.0 2017-09-04 10835.0 2015-12-21
3 2015-12-22 10495.0 2017-09-05 10660.0 2015-12-22
4 2015-12-23 10425.0 2017-09-06 10535.0 2015-12-23
233 JP Equity Unnamed: 6 235 JP Equity
0 10330.0 2017-08-31 10460.0
1 10710.0 2017-09-01 10815.0
2 10720.0 2017-09-04 10835.0
3 10495.0 2017-09-05 10660.0
4 10425.0 2017-09-06 10535.0
s = df.columns.to_series().shift(-1) + ' Date'
s = s[s.index.str.startswith('Unnamed')]
print (s)
Unnamed: 0 233740 KS Equity Date
Unnamed: 2 233160 KS Equity Date
Unnamed: 4 233 JP Equity Date
Unnamed: 6 235 JP Equity Date
dtype: object
df = df.rename(columns=s)
f = lambda x: x.split(' ',1)[1]
df = pd.concat([x.set_index(x.columns[0]).rename(columns=f) for i, x
in df.groupby(df.columns.str.split(n=1).str[0], axis=1)], 1).stack().unstack()
print (df)
JP Equity KS Equity
2015-12-17 10330.0 10330.0
2015-12-18 10710.0 10710.0
2015-12-21 10720.0 10720.0
2015-12-22 10495.0 10495.0
2015-12-23 10425.0 10425.0
2017-08-31 10460.0 10460.0
2017-09-01 10815.0 10815.0
2017-09-04 10835.0 10835.0
2017-09-05 10660.0 10660.0
2017-09-06 10535.0 10535.0