2017-10-19 52 views
-2

我有一個file.txt(製表符分隔),需要更改爲一個數據框,基本上命令文件逐行閱讀,併爲最終數據框創建唯一列。另外,在沒有信息建立時寫「Na」或空值。在「:」之後注意「CS_」。 我在想大熊貓數據幀,但您的幫助將不勝感激。 R中的建議也值得讚賞。創建獨特的數據幀,逐行讀取文件

輸入:

Japan  Cases:CS_1 People:CS_2 Life:CS_3 
Australia People:CS_4 Transportation:CS_Ground 
Spain  Life:CS_5  Language:CS_Spanish 

輸出:

   Cases  People Life  Transportation  Language 
Japan  CS_1  CS_2  CS_3  Na     Na 
Australia Na  CS_4  Na  CS_Ground   Na 
Spain  Na  Na  CS_5  Na     CS_Spanish 
+0

你有什麼到目前爲止已經試過? – asongtoruin

+1

一種方法是將文本文件讀入嵌套字典中,並將國家作爲外鍵:'''''':{'Cases':'CS_1','人物':CS_2','生活':'CS_3 '},'澳大利亞':{...},'西班牙':{...}}'然後迭代字典以獲得所有列名稱。然後創建你的數據框。 – DaveL17

+0

當然我使用Python,因爲我有一個龐大的數據文件,否則您的解決方案將是一段路要走。我有成千上萬的行和超過10個不同的列 – gusa10

回答

0

考慮:

>>> from io import StringIO 
>>> infile = """Japan Cases:CS_1 People:CS_2 Life:CS_3 
... Australia People:CS_4 Transportation:CS_Ground 
... Spain Life:CS_5 Language:CS_Spanish""" 

迭代通過文件一行一行地:

  1. 分區從靜止
  2. 拆分其餘部分與適當的定界符的第一列(例如\s\t
  3. 分割的每個元素到其中的鍵是你在最後的數據幀所需的列標題鍵值對
  4. 添加的第一列的值(即國名),並使用一個臨時的頭名(例如, Key
  5. 存儲字典中的列表

[代碼]:

>>> row_dicts = [] 
>>> for line in StringIO(infile): 
...  k, _, therest =line.partition(' ') # Step 1. 
...  _row = {kv.split(':')[0]:kv.split(':')[1] for kv in therest.split()} # Step 2-3. 
...  _row['Key'] = k # Step 4. 
...  row_dicts.append(_row) # Step 5. 
... 

角色的列表字典成pd.DataFrame

>>> pd.DataFrame(row_dicts) 
    Cases  Key Language Life People Transportation 
0 CS_1  Japan   NaN CS_3 CS_2   NaN 
1 NaN Australia   NaN NaN CS_4  CS_Ground 
2 NaN  Spain CS_Spanish CS_5 NaN   NaN 

使用.set_index設置國家Key列索引。

>>> df.set_index('Key') 
      Cases Language Life People Transportation 
Key              
Japan  CS_1   NaN CS_3 CS_2   NaN 
Australia NaN   NaN NaN CS_4  CS_Ground 
Spain  NaN CS_Spanish CS_5 NaN   NaN 
0

你可以使用(使用一臺發電機和理解):

import re, pandas as pd 

string = """ 
Japan  Cases:CS_1 People:CS_2 Life:CS_3 
Australia People:CS_4 Transportation:CS_Ground 
Spain  Life:CS_5  Language:CS_Spanish 
""" 

rx = re.compile(r'(?P<key>\w+):(?P<value>CS_\d+)') 
rxc = re.compile(r'(?P<country>\w+)') 

dft = (dict({'Country': item.group('country')}, **{m.group('key'): m.group('value') for m in rx.finditer(line)}) 
     for line in string.split("\n") 
     for item in [rxc.match(line)] 
     if item) 

df = pd.DataFrame(dft) 
print(df) 

它使用兩個正則表達式,一個是國家,一個是鍵/值對。此後,將df構造。