2017-07-25 159 views
0

當試圖讀取一些列使用它們的索引從一個表格文件與熊貓read_csv看起來usecolsnames彼此不同步。pandas read_csv usecols和名稱不同步

例如,具有文件test.csv

FOO A -46450.494736 0.0728830817231 
FOO A -46339.7126846 0.0695018062805 
FOO A -46322.4942905 0.0866205763556 
FOO B -46473.3117983 0.0481618121947 
FOO B -46537.6827055 0.0436893868921 
FOO B -46467.2102205 0.0485001911304 
BAR C -33424.1224914 6.7981041851 
BAR C -33461.4101485 7.40607068177 
BAR C -33404.6396495 4.72117502707 

,並試圖讀取3列由指數不保留原來的順序:

cols = [1, 2, 0] 
names = ['X', 'Y', 'Z'] 

df = pd.read_csv(
       'test.csv', sep='\t', 
       header=None, 
       index_col=None, 
       usecols=cols, names=names) 

我得到了以下數據框:

 X Y    Z 
0 FOO A -46450.494736 
1 FOO A -46339.712685 
2 FOO A -46322.494290 
3 FOO B -46473.311798 
4 FOO B -46537.682706 
5 FOO B -46467.210220 
6 BAR C -33424.122491 
7 BAR C -33461.410148 
8 BAR C -33404.639650 

而我期望列ZFOOBAR,像這樣:

 Z X    Y 
0 FOO A -46450.494736 
1 FOO A -46339.712685 
2 FOO A -46322.494290 
3 FOO B -46473.311798 
4 FOO B -46537.682706 
5 FOO B -46467.210220 
6 BAR C -33424.122491 
7 BAR C -33461.410148 
8 BAR C -33404.639650 

我知道大熊貓存儲dataframes作爲字典所以列的順序可能與要求與usecols不同,但這裏的問題是,使用usecols與索引和名稱沒有意義

我真的需要通過它們的索引來讀取列,然後爲它們分配名稱。有沒有解決方法?

回答

2

的文檔可以更清晰的關於這個(!放心大膽的issue,甚至更好提交pull請求),但usecols設置樣 - 它沒有定義列的順序,簡單說就是對所測試會員。

from io import StringIO 

pd.read_csv(StringIO("""a,b,c 
1,2,3 
4,5,6"""), usecols=[0, 1, 2]) 

Out[31]: 
    a b c 
0 1 2 3 
1 4 5 6 

pd.read_csv(StringIO("""a,b,c 
1,2,3 
4,5,6"""), usecols=[2, 1, 0]) 

Out[32]: 
    a b c 
0 1 2 3 
1 4 5 6 

names另一方面是命令。因此,在這種情況下,答案是按照您希望的順序指定名稱。

+0

是的,的確如此。這個文檔可能會更清晰。我發現的解決方案是在讀取文件時不使用'names',使用相同的'cols'索引對df進行重新排序,並在最後重命名列。例如:'df = pd.read_csv(...,usecols = cols)[cols]; df.columns = names' – PedroA

相關問題