pandas: 如何读取分行文件
pandas: how to read file with divided rows
我想把一个dat
文件读入pandas
(我用的是read_table()
),在文件中每行观察被分成多行,像这样:
var1 var2 var3
var4 var5 var6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6
在这种情况下,每个观察值分为两行。
您可以在函数 read_csv
:
中使用参数 skiprows
和 header
import pandas as pd
import io
temp=u"""var1 var2 var3
var4 var5 var6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6"""
print range(0, 10)[1::2]
[1, 3, 5, 7, 9]
#after testing replace io.StringIO(temp) to filename
df1 = pd.read_csv(io.StringIO(temp),
sep='\s+',
header=0,
index_col=None,
skiprows=(range(0, 10)[1::2]))
print df1
var1 var2 var3
0 1 2 3
1 1 2 3
2 1 2 3
print range(2, 10)[::2]
[2, 4, 6, 8]
#after testing replace io.StringIO(temp) to filename
df2 = pd.read_csv(io.StringIO(temp),
sep='\s+',
header=1,
index_col=None,
skiprows=(range(2, 10)[::2]))
print df2
var4 var5 var6
0 4 5 6
1 4 5 6
2 4 5 6
或者您可以使用 read_csv
中的 header=[0,1]
和函数 droplevel
的后处理(如 所建议的那样)。最后你可以 reset_index
:
import pandas as pd
import io
temp=u"""var1 var2 var3
var4 var5 var6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6"""
df = pd.read_csv(io.StringIO(temp),
sep='\s+',
header=[0,1])
print df
var1 var2 var3
var4 var5 var6
0 1 2 3
1 4 5 6
2 1 2 3
3 4 5 6
4 1 2 3
5 4 5 6
df1 = df[::2]
df1.columns=df.columns.droplevel(1)
print df1.reset_index(drop=True)
var1 var2 var3
0 1 2 3
1 1 2 3
2 1 2 3
df1 = df[1::2]
df1.columns=df.columns.droplevel(0)
print df1.reset_index(drop=True)
var4 var5 var6
0 4 5 6
1 4 5 6
2 4 5 6
我想把一个dat
文件读入pandas
(我用的是read_table()
),在文件中每行观察被分成多行,像这样:
var1 var2 var3
var4 var5 var6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6
在这种情况下,每个观察值分为两行。
您可以在函数 read_csv
:
skiprows
和 header
import pandas as pd
import io
temp=u"""var1 var2 var3
var4 var5 var6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6"""
print range(0, 10)[1::2]
[1, 3, 5, 7, 9]
#after testing replace io.StringIO(temp) to filename
df1 = pd.read_csv(io.StringIO(temp),
sep='\s+',
header=0,
index_col=None,
skiprows=(range(0, 10)[1::2]))
print df1
var1 var2 var3
0 1 2 3
1 1 2 3
2 1 2 3
print range(2, 10)[::2]
[2, 4, 6, 8]
#after testing replace io.StringIO(temp) to filename
df2 = pd.read_csv(io.StringIO(temp),
sep='\s+',
header=1,
index_col=None,
skiprows=(range(2, 10)[::2]))
print df2
var4 var5 var6
0 4 5 6
1 4 5 6
2 4 5 6
或者您可以使用 read_csv
中的 header=[0,1]
和函数 droplevel
的后处理(如 reset_index
:
import pandas as pd
import io
temp=u"""var1 var2 var3
var4 var5 var6
1 2 3
4 5 6
1 2 3
4 5 6
1 2 3
4 5 6"""
df = pd.read_csv(io.StringIO(temp),
sep='\s+',
header=[0,1])
print df
var1 var2 var3
var4 var5 var6
0 1 2 3
1 4 5 6
2 1 2 3
3 4 5 6
4 1 2 3
5 4 5 6
df1 = df[::2]
df1.columns=df.columns.droplevel(1)
print df1.reset_index(drop=True)
var1 var2 var3
0 1 2 3
1 1 2 3
2 1 2 3
df1 = df[1::2]
df1.columns=df.columns.droplevel(0)
print df1.reset_index(drop=True)
var4 var5 var6
0 4 5 6
1 4 5 6
2 4 5 6