2016-09-06 65 views
1

我是熊貓新手,我正在處理一個數據集,其中一列是帶有管道(|)的字符串分隔值。現在我有一項任務,即刪除此分隔字段中不符合特定條件的任何文本。熊貓數據框可以有dtype的列表嗎?

我的幼稚方法是逐行迭代數據幀,並將該字段分解爲列表並以此方式進行驗證。然後將修改後的行寫回原始數據框。看到這個metasample:

for index, row in dataframe.iterrows(): 
    fixed = [x[:29] for x in row['field'].split('|')] 
    dataframe.loc[index, 'field'] = "|".join(fixed) 

是否有更好,更重要的是更快的方式來做到這一點?

+0

在乍一看,這似乎只是對我來說,數據結構的濫用。爲什麼有一列是由分隔符分隔的字段列表?其他欄目是什麼? –

+0

您能否提供該列或數據框的任何示例? –

+0

@ juanpa.arrivillaga好吧,這就是數據在CSV中的表現。還有其他一些列,但這是唯一一個具有列表結構的列。關鍵是,在我看到的原始數據中,有時候這些值中的一個是錯誤的......我需要將其過濾掉,然後再繼續處理數據集 –

回答

2

IIUC你可以使用:

dataframe = pd.DataFrame({'field':['aasd|bbuu|cccc|ddde|e','ffff|gggg|hhhh|i|j','cccc|u|k'], 
          'G':[4,5,6]}) 

print (dataframe) 
    G     field 
0 4 aasd|bbuu|cccc|ddde|e 
1 5  ffff|gggg|hhhh|i|j 
2 6    cccc|u|k 


print (dataframe.field.str.split('|', expand=True) 
          .stack() 
          .str[:2] #change to 29 
          .groupby(level=0) 
          .apply('|'.join)) 

0 aa|bb|cc|dd|e 
1  ff|gg|hh|i|j 
2   cc|u|k 
dtype: object 

另一種解決方案通過列表理解:

dataframe['new'] = pd.Series([[x[:2] for x in y] for y in dataframe.field.str.split('|')], 
          index=dataframe.index) 
        .apply('|'.join) 
print (dataframe) 
    G     field   new 
0 4 aasd|bbuu|cccc|ddde|e aa|bb|cc|dd|e 
1 5  ffff|gggg|hhhh|i|j ff|gg|hh|i|j 
2 6    cccc|u|k   cc|u|k 

dataframe = pd.DataFrame({'field':['aasd|bbuu|cc|ddde|e','ffff|gggg|hhhh|i|j','cccc|u|k'], 
        'G':[4,5,6]}) 

print (dataframe) 
    G    field 
0 4 aasd|bbuu|cc|ddde|e 
1 5 ffff|gggg|hhhh|i|j 
2 6    cccc|u|k 

如果需要過濾器值不再作爲2所有值:

s = dataframe.field.str.split('|', expand=True).stack() 
print (s) 
0 0 aasd 
    1 bbuu 
    2  cc 
    3 ddde 
    4  e 
1 0 ffff 
    1 gggg 
    2 hhhh 
    3  i 
    4  j 
2 0 cccc 
    1  u 
    2  k 
dtype: object 

dataframe['new'] = s[s.str.len() < 3].groupby(level=0).apply('|'.join) 
print (dataframe) 

    G    field new 
0 4 aasd|bbuu|cc|ddde|e cc|e 
1 5 ffff|gggg|hhhh|i|j i|j 
2 6    cccc|u|k u|k 

另一種解決方案:

dataframe['new'] = pd.Series([[x for x in y if len(x) < 3] for y in dataframe.field.str.split('|')], 
           index=dataframe.index) 
        .apply('|'.join) 
print (dataframe) 
    G    field new 
0 4 aasd|bbuu|cc|ddde|e cc|e 
1 5 ffff|gggg|hhhh|i|j i|j 
2 6    cccc|u|k u|k 
+0

謝謝,這是非常全面的工作 –