用不同的列顺序将csv读取到df

时间:2019-01-17 13:31:44

标签: python pandas csv

我有一个很大的CSV文件,该文件是通过别人的脚本创建的,其输出列名为“ D”,“ B”,“ A”,“ C”。
有没有一种方法可以直接从CSV中以“ A”,“ B”,“ C”,“ D”的形式读取它。

6 个答案:

答案 0 :(得分:2)

我发现此解决方案适用于熊猫0.25.1

CSV文件,其输出列名为“ D”,“ B”,“ A”,“ C” 从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”的熊猫数据框 index_col = []和usecols = []都必须包含相同的列表顺序。

答案 1 :(得分:1)

我认为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

答案 2 :(得分:1)

我假设您不是在问如何更改Pandas中的列顺序,而是想在读入之前更改它,可能会减少内存使用。 (如果看不到@jezrael的回答。)

最好是先读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

答案 3 :(得分:1)

一种方法是一次读取一列并存储在列表推导中,然后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']]

答案 4 :(得分:0)

尝试熊猫:

import pandas as pd
df=pd.read_csv(filename)
df=df[df.columns[::-1]]

答案 5 :(得分:0)

添加.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()