【发布时间】:2019-01-17 13:31:44
【问题描述】:
我有一个通过其他人的脚本创建的大型 CSV 文件,其中包含名为“D”、“B”、“A”、“C”的输出列。
有没有办法直接从CSV读取它作为'A','B','C','D'。
【问题讨论】:
我有一个通过其他人的脚本创建的大型 CSV 文件,其中包含名为“D”、“B”、“A”、“C”的输出列。
有没有办法直接从CSV读取它作为'A','B','C','D'。
【问题讨论】:
我发现这个解决方案适用于 pandas 0.25.1
具有名为“D”、“B”、“A”、“C”的输出列的 CSV 文件 直接从 CSV 中读取为“A”、“B”、“C”、“D”
import pandas as pd
csv = pd.read_csv(data, index_col=['A', 'B', 'C', 'D'], usecols=['A', 'B', 'C', 'D'])
它以给定的顺序将 CSV 列读入名为“csv”的 pandas DataFrame index_col=[] 和 usecols=[] 都必须包含相同的列表顺序。
【讨论】:
我认为read_csv 做不到,usecols 的想法也行不通:
import pandas as pd
temp=u"""D;B;A;C
0;a;4;7;1
1;b;5;8;3
2;c;4;9;5
3;d;5;4;7
4;e;5;2;1
5;f;4;3;0"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep=";", usecols=['A', 'B', 'C', 'D'])
print (df)
D B A C
0 0 a 4 7
1 1 b 5 8
2 2 c 4 9
3 3 d 5 4
4 4 e 5 2
5 5 f 4 3
解决方案是按列表或排序索引更改顺序:
df = df[['A', 'B', 'C', 'D']]
print (df)
A B C D
0 4 a 7 0
1 5 b 8 1
2 4 c 9 2
3 5 d 4 3
4 5 e 2 4
5 4 f 3 5
df = df.sort_index(axis=1)
print (df)
A B C D
0 4 a 7 0
1 5 b 8 1
2 4 c 9 2
3 5 d 4 3
4 5 e 2 4
5 4 f 3 5
【讨论】:
一种方法是一次读取一列并存储在列表理解中,然后concat 结果:
In[121]:
t="""D,B,A,C
4,2,1,3"""
cols = list('ABCD')
pd.concat([pd.read_csv(io.StringIO(t), usecols=[x]) for x in cols], axis=1)
Out[121]:
A B C D
0 1 2 3 4
但是,我认为通过在正常阅读后按您想要的顺序子选择列来对其进行排序会更容易:
df = df[['A','B','C','D']]
【讨论】:
我假设您不是在询问如何更改 Pandas 中的列顺序,而是想在读入之前更改它,可能是为了减少内存使用。 (如果没有看到@jezrael 的回答。)
最好在读入 Pandas 之前使用csv。示例:
import csv
with open('file.csv', 'r') as infile, open('reordered.csv', 'a') as outfile:
fieldnames = ['A', 'B', 'C', 'D']
writer = csv.DictWriter(outfile, fieldnames=fieldnames)
writer.writeheader()
for row in csv.DictReader(infile):
writer.writerow(row)
取自here
就时间而言,最快的是以 CSV 格式进行的(我用一个非常小的 csv 文件进行了测试):
%%time
df = pd.read_csv('r.csv')[['A', 'B', 'C', 'D']]
CPU times: user 3.53 ms, sys: 1.48 ms, total: 5 ms
Wall time: 3.79 ms
%%time
df=pd.read_csv('r.csv')[df.columns[::-1]]
CPU times: user 4.75 ms, sys: 2.01 ms, total: 6.76 ms
Wall time: 5.13 ms
%%time
cols=list('ABCD')
pd.concat([pd.read_csv('r.csv', usecols=[x]) for x in cols], axis=1)
CPU times: user 8.98 ms, sys: 2.25 ms, total: 11.2 ms
Wall time: 9.88 ms
%%time
df = pd.read_csv('r.csv').sort_index(axis=1)
CPU times: user 4.21 ms, sys: 1.88 ms, total: 6.09 ms
Wall time: 4.65 ms
%%time
with open('r.csv', 'r') as infile, open('reordered.csv', 'a') as outfile:
fieldnames = ['A', 'B', 'C', 'D']
writer = csv.DictWriter(outfile, fieldnames=fieldnames)
writer.writeheader()
for row in csv.DictReader(infile):
writer.writerow(row)
df = pd.read_csv('reordered.csv')
CPU times: user 3.29 ms, sys: 1.91 ms, total: 5.2 ms
Wall time: 3.83 ms
【讨论】:
添加 .reset_index() 以重置 index_col 集合中的索引。
import pandas as pd
csv = pd.read_csv(data, index_col=['A', 'B', 'C', 'D'], usecols=['A', 'B', 'C', 'D']).reset_index()
【讨论】:
试试熊猫:
import pandas as pd
df=pd.read_csv(filename)
df=df[df.columns[::-1]]
【讨论】: