2017-05-20 76 views
2

我有一個文本文件。文件中的每一行看起來是這樣,但有不同的長度:如何從文本文件創建數據幀

negative فينو اهبل ابن اهبل 
positive فينو اهبل ابن اهبل 
neutral فينو اهبل ابن اهبل 

當我使用pandas.read_table它讀成一列,我嘗試轉換文件到Excel或CSV,但還是將其轉換爲一列

我希望它是一個兩列數據框,其中negative在其自己的列中,其餘列在其他列中。

+0

是否總是'negative',或者你只是想在第一空間打破? –

+0

看看'pd.read_fwf' –

+0

沒有3個數值正數,負數,中性數 –

回答

2

先讀取整個文件轉換成數據幀與單個列:

df = pd.read_csv('/path/to/file.txt', sep='~', header=None) 

產量:

In [50]: df 
Out[50]: 
          0 
0 negative aaa bbb ccc ddd 
1   positive qqq vvv 

現在我們可以分析它是這樣的:

In [51]: df[['col1','col2']] = df.pop(0).str.extract(r'^([^\s]+)\s*(.*?)$', expand=True) 

In [52]: df 
Out[52]: 
     col1    col2 
0 negative aaa bbb ccc ddd 
1 positive   qqq vvv 

或:

In [65]: df[['col1','col2']] = df.pop(0).str.split(n=1, expand=True) 

In [66]: df 
Out[66]: 
     col1    col2 
0 negative aaa bbb ccc ddd 
1 positive   qqq vvv 
2

您可以構建自己的解析器,如:

代碼:

def parse_my_file(filename): 
    with open(filename) as f: 
     for line in f: 
      yield line.strip().split(' ', 1) 

測試代碼:

df = pd.DataFrame(parse_my_file('file1')) 
print(df) 

結果:

  0     1 
0 negative فينو اهبل ابن اهبل 
1 neutral فينو اهبل ابن اهبل 
2 positive فينو اهبل ابن اهبل 
+1

非常有趣的方法! – MaxU

+0

非常感謝,完美!我嘗試過之前分裂,但從未使用收益,所以我得到了多個錯誤 –

1

輸入:

from io import StringIO 

table = """ 
negative فينو اهبل ابن اهبل 
positive فينو اهبل ابن اهبل 
neutral فينو اهبل ابن اهبل 
negative فينو اهبل ابن اهبل 
negative فينو اهبل ابن اهبل 
negative فينو اهبل ابن اهبل 
""" 

讀文件:

df_in = pd.read_fwf(StringIO(table),widths=[8,1000]) 
print(df_in) 

輸出:

Unnamed: 0   Unnamed: 1 
0 negative فينو اهبل ابن اهبل 
1 positive فينو اهبل ابن اهبل 
2 neutral فينو اهبل ابن اهبل 
3 negative فينو اهبل ابن اهبل 
4 negative فينو اهبل ابن اهبل 
5 negative فينو اهبل ابن اهبل