簡體   English   中英

Python:從csv解析未命名的列

[英]Python: parse unnamed columns from csv

我想從以前生成的csv文件中正確讀取未命名的列。

csv的每列具有一個具有不同形狀的多索引標頭,即列0具有一個坐標,列1具有兩個坐標,列2具有三個坐標。 因此,在讀取完整的csv時,未命名的列會出現在列0和列1中。我需要找到具有給定值的行,但無法傳遞正確的列。

想象一下“ my.csv”文件看起來像這樣:

C0,C1,C2
,C10,C20
,,C22
-2,0,0.4101
-1,1,0.8058
0,0,0.1000
1,3,0.3846

我嘗試閱讀它:

read_df = pd.read_csv('my.csv', header=[0,1,2]) 
print(read_df)

                  C0                 C1      C2
  Unnamed: 0_level_1                C10     C20
  Unnamed: 0_level_2 Unnamed: 1_level_2     C22
0                 -2                  0  0.4101
1                 -1                  1  0.8058
2                  0                  0  0.1000
3                  1                  3  0.3846

我需要選擇與C0值相對應的行,但最終還是出現在KeyError或TypeError中,如下所示:

read_df.loc( read_df[('C0','','')] == 0 )  ## KeyError: ('C0', '', '')

read_df.loc( read_df[('C0','0_level_1','0_level_2')] == 0 ) ## KeyError: ('C0', '0_level_1', '0_level_2')

read_df.loc( read_df[('C0', 'Unnamed: 0_level_1', 'Unnamed: 0_level_2')] == 0 ) ## TypeError: 'Series' objects are mutable, thus they cannot be hashed

一種解決方法是事先命名各列並防止這種情況發生,但是最好了解如何進行管理。

謝謝

PS這就是我生成“ my.csv”的方式

import pandas as pd
import random as rnd

col_0 = [('C0', '', '')]
col_1 = [('C1', 'C10','')]
col_2 = [('C2', 'C20', 'C22')]

tot_col = columns=pd.MultiIndex.from_tuples(col_0 + col_1 + col_2)

tot_df = pd.DataFrame(columns=tot_col)

def get_data():
    data_dict = { ('C1','C10','')    : rnd.randint(0,5),
                  ('C2','C20','C22') : '{:2.4f}'.format(rnd.random()) }
    data_df = pd.DataFrame( [data_dict], columns=tot_col )
    return(data_df)

for ii in range(-2, 2):
    ii_df = get_data()
    ii_df[('C0','','')] = ii
    tot_df = pd.concat([tot_df, ii_df], ignore_index=True)

tot_df.to_csv('my.csv', index=False)

IIUC您在尋找

read_df.loc[ read_df[('C0', 'Unnamed: 0_level_1', 'Unnamed: 0_level_2')] == 0 ]

或簡單地

read_df[read_df[('C0', 'Unnamed: 0_level_1', 'Unnamed: 0_level_2')] == 0]

結果:

                  C0                 C1      C2
  Unnamed: 0_level_1                C10     C20
  Unnamed: 0_level_2 Unnamed: 1_level_2     C22
2                  0                  4  0.2373




恢復原始索引有點笨拙:

read_df[read_df[('C0','','')] == 0]

之后,您可以照常使用:

  C0  C1      C2
     C10     C20
             C22
2  0   4  0.2373

結果:

  C0 C1 C2 C10 C20 C22 2 0 4 0.2373 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM