簡體   English   中英

熊貓使用MultiIndex切片數據

[英]Pandas slicing data with MultiIndex

我有一些要寫入某些csv文件的功能。 如果可能的話,我想將熊貓用於這種方法。
我正在按照此處的說明進行操作,並創建了一些虛擬數據以將其檢出。 基本上,有些活動具有屬於它們的隨機數量的功能。

import io
data = io.StringIO('''Activity,id,value,value,value,value,value,value,value,value,value
Run,1,1,2,2,5,6,4,3,2,1
Run,1,2,4,4,10,12,8,6,4,2
Stand,2,1.5,3.,3.,7.5,9.,6.,4.5,3.,1.5
Sit,3,0.5,1.,1.,2.5,3.,2.,1.5,1.,0.5
Sit,3,0.6,1.2,1.2,3.,3.6,2.4,1.8,1.2,0.6
Run, 2, 0.8, 1.6, 1.6, 4. , 4.8, 3.2, 2.4, 1.6, 0.8
''')
df_unindexed = pd.read_csv(data)
df = df_unindexed.set_index(['Activity', 'id'])

當我跑步時:

df.xs('Run')

我懂了

    value  value.1  value.2  value.3  value.4  value.5  value.6  value.7  \
id                                                                         
1     1.0      2.0      2.0      5.0      6.0      4.0      3.0      2.0   
1     2.0      4.0      4.0     10.0     12.0      8.0      6.0      4.0   
2     0.8      1.6      1.6      4.0      4.8      3.2      2.4      1.6   
    value.8  
id           
1       1.0  
1       2.0  
2       0.8 

這幾乎是我想要的,那就是所有run活動。 我想刪除第一行和第一列,即標題和id列。 我該如何實現?

另外一個第二個問題是,當我只想要一項活動時,如何獲得它。
使用時

idx = pd.IndexSlice
df.loc[idx['Run', 1], :]

             value  value.1  value.2  value.3  value.4  value.5  value.6  \
Activity id                                                                
Run      1     1.0      2.0      2.0      5.0      6.0      4.0      3.0   
         1     2.0      4.0      4.0     10.0     12.0      8.0      6.0   
             value.7  value.8  
Activity id                    
Run      1       2.0      1.0  
         1       4.0      2.0  

但切片無法像我期望的那樣工作。 例如嘗試

df.loc[idx['Run', 1], 2:11]

而是產生一個錯誤:

TypeError:無法使用“ int”>的這些索引器[2]進行切片索引

那么,如何在這個地方獲得功能?

PS:如果不清楚,我對Pandas並不Pandas所以要保持溫柔。 此外,列id可以編輯,以使每個活動或整個數據集都是唯一的,如果這樣會使事情變得更容易等。

您可以使用一些技巧-通過位置獲取列名稱,因為尚不支持 iloc for MultiIndex

print (df.columns[2:11])
Index(['value.2', 'value.3', 'value.4', 'value.5', 'value.6', 'value.7',
       'value.8'],
      dtype='object')

idx = pd.IndexSlice
print (df.loc[idx['Run', 1], df.columns[2:11]])
             value.2  value.3  value.4  value.5  value.6  value.7  value.8
Activity id                                                               
Run      1       2.0      5.0      6.0      4.0      3.0      2.0      1.0
         1       4.0     10.0     12.0      8.0      6.0      4.0      2.0

如果要將文件保存到沒有索引和列的csv中:

df.xs('Run').to_csv(file, index=False, header=None)

當我遇到這類問題時,我通常會查看https://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-integer

沒有任何測試,我想您可以刪除行和列,例如

df = df.drop(['rowindex'], axis=0)
df = df.drop(['colname'], axis=1)

通過在CSV讀取時識別索引列來避免此問題:

pd.read_csv(header=0, # to read in the header row as a header row, and 
... index_col=['id'] or index_col=0 to pick the index column.

暫無
暫無

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

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