2017-08-08 108 views
2

我已經導入與Jupyter筆記本(Python的2)熊貓read_csv製表符分隔的文件中提取列名,我已經提取出的關注的Python - 熊貓 - 從數據幀

rawData = pd.read_csv(filename, delim_whitespace = True, header = 20) 
columnOfInterest = rawData.ix[:, 9] 

格式的單柱我感興趣的列如下所示:

header1=123;header2=123;header3=123 

並非此DataFrame中的每一行都有每個標題,並且我不知道可能的標題的完整集合。 123,我的數據值都是數字。

將列中的元素分開使用後;作爲我的分隔符,我所有的行都有許多列等於行中值的數量,這在數據集中是不統一的。我想將其轉換爲缺少值的矩陣。

我想要做的是從我的DataFrame中取出每一行,提取標題信息,如果標題標籤是新的(即它不存在於已處理的任何行中),那麼我會喜歡將它添加到我的列名稱列表中。當然,我希望從行中刪除標題名稱和等號,並且我希望我的數據都處於適當的位置(所以,使用附加到每個數據值的標題信息將值放在適當的列中)。所以,我想看起來像這樣的東西:

# Original data frame, first 2 rows 
['header1=123', 'header2=123', 'header3=123'] # <--- no header4 
['header1=123', 'header3=123', 'header4=123'] # <--- no header2 

# New data frame, first 2 rows plus column names 
header1 header2 header3 header4 
123  123  123  null # <--- header4 == null 
123  null  123  123  # <--- header2 == null 

顯然,這似乎是一個正則表達式的工作!然而,我對如何在熊貓中去解決這個問題感到不知所措。缺失的數據應該爲空。

謝謝!

回答

2

如果你有數據幀像

df = pd.DataFrame([['header1=123', 'header2=123', 'header3=123'],['header1=123', 'header3=123', 'header4=123']]) 

然後,您可以通過=分割數據,然後創建一個字典和pd.DataFrame構造函數將負責其餘的即

new = [[j.split('=') for j in i] for i in df.values ] 

di=[{k:j for k,j in i} for i in new] 

new_df = pd.DataFrame(di) 

輸出:

字典:

 
[ {'header1': '123', 'header2': '123', 'header3': '123'}, 
{'header1': '123', 'header3': '123', 'header4': '123'}] 

數據框:

 
    header1 header2 header3 header4 
0  123  123  123  NaN 
1  123  NaN  123  123 

希望它可以幫助

+0

聖摩西!這很完美,非常感謝。哦,還有漂亮的圖靈頭像! –

+0

非常感謝您的幫助。做upvote並接受答案,如果有幫助 – Dark

+0

完成!我早些時候嘗試過投票,但我沒有足夠高的代表分數。有人提出了我的問題,讓我跨入門檻,所以現在我可以高興起來! –

3

您可以使用嵌套list comprehension爲皈依dict然後DataFrame唯一的構造:

print (df) 
            col 
0 header1=123;header2=123;header3=123 
1 header1=123;header3=123;header4=123 

d = [dict([y.split('=') for y in x]) for x in df['col'].str.split(';').values.tolist()] 
print (d) 
[{'header1': '123', 'header3': '123', 'header2': '123'}, 
{'header1': '123', 'header4': '123', 'header3': '123'}] 

df = pd.DataFrame(d) 
print (df) 
    header1 header2 header3 header4 
0  123  123  123  NaN 
1  123  NaN  123  123 

如果值由;分裂,解決方案simplier:

print (df) 
             col 
0 [header1=123, header2=123, header3=123] 
1 [header1=123, header3=123, header4=123] 

d = [dict([y.split('=') for y in x]) for x in df['col'].values.tolist()] 
df = pd.DataFrame(d) 
print (df) 
    header1 header2 header3 header4 
0  123  123  123  NaN 
1  123  NaN  123  123 
+0

感謝您的迴應!我嘗試了你建議的第二個模塊(已經分割了數值),我無法完全按照原來的方式工作。我用'替換了'col',並且這一切都很完美。再次感謝 –

0

使用apply

In [1178]: df.col.apply(lambda x: pd.Series(
         dict([tuple(y.split('=')) for y in x.split(';')]))) 
Out[1178]: 
    header1 header2 header3 header4 
0  123  123  123  NaN 
1  123  NaN  123  123 

或者,

In [1532]: df.col.apply(lambda x: pd.Series(
         dict(map(lambda y: tuple(y.split('=')), x.split(';'))))) 
Out[1532]: 
    header1 header2 header3 header4 
0  123  123  123  NaN 
1  123  NaN  123  123