python - 将列分配给由字符串构造的 pandas 数据框

标签 python pandas

我有以下内容。数据作为 Python 字符串,称为结果:

= 382. ppm
                                                   SOIL LAYER NO
                        1           1           2         TOT
       DEPTH(m)        0.01        1.24        1.52
 BD 33kpa(t/m3)        1.60        1.60        1.60
        SAND(%)        42.1        42.1        65.1
        SILT(%)        37.9        37.9        16.9
        CLAY(%)        20.0        20.0        18.0
        ROCK(%)        12.0        12.0        12.0
     WLS(kg/ha)         0.0         5.0         0.1         5.1
     WLM(kg/ha)         0.0         5.0         0.1         5.1
    WLSL(kg/ha)         0.0         4.0         0.1         4.1
    WLSC(kg/ha)         0.0         2.1         0.0         2.1
    WLMC(kg/ha)         0.0         2.1         0.0         2.1
   WLSLC(kg/ha)         0.0         1.7         0.0         1.7
  WLSLNC(kg/ha)         0.0         0.4         0.0         0.4
    WBMC(kg/ha)         9.0      1102.1       250.9      1361.9
    WHSC(kg/ha)         69.       8432.       1920.      10420.
    WHPC(kg/ha)        146.      18018.       4102.      22266.
     WOC(kg/ha)        224.      27556.       6272.         34.
    WLSN(kg/ha)         0.0         0.0         0.0         0.0
    WLMN(kg/ha)         0.0         0.2         0.0         0.2
    WBMN(kg/ha)         0.9       110.2        25.1       136.2
    WHSN(kg/ha)          7.        843.        192.       1042.
    WHPN(kg/ha)         15.       1802.        410.       2227.
     WON(kg/ha)         22.       2755.        627.       3405.
    CFEM(kg/ha)          0.


         2008  12  31     

这里的每一行都是列表中的一个元素。我想将其转换为 pandas 数据帧,其标题来自第三行,即 1 1 2 TOT,并且我想忽略最后一行,即 2008 12 31。这是我现在正在做的事情:

last_line = len(result.split('\n'))
df = pandas.DataFrame(result.split('\n')[2:last_line-1])

如何分配列?如果我只得到标题为“TOT”的列也没关系

最佳答案

字符串中有多个空格,所以我将它们全部替换为;。然后使用函数 read_csv使用参数 skiprows=3(跳过文件的前 3 行)和 names(定义列名称)。

import pandas
from StringIO import StringIO

pathToFile = 'test/file.txt'
f = open(pathToFile)
s = StringIO()
cur_ID = None
for ln in f:
    #replace multiply spaces to one ;
    ln = ';'.join(ln.split())
    if  ln.startswith('BD;'):
        ln = ln.replace('BD;', 'BD ') 
    if  (ln.startswith('19')) | (ln.startswith('20')):
        continue;        
    s.write(ln + '\n')
s.seek(0)

df = pandas.read_csv(s, skiprows=3, sep=';', names=['0','1','2','3','TOT'])
print df
#                 0       1         2        3      TOT
#0         DEPTH(m)    0.01      1.24     1.52      NaN
#1   BD 33kpa(t/m3)    1.60      1.60     1.60      NaN
#2          SAND(%)   42.10     42.10    65.10      NaN
#3          SILT(%)   37.90     37.90    16.90      NaN
#4          CLAY(%)   20.00     20.00    18.00      NaN
#5          ROCK(%)   12.00     12.00    12.00      NaN
#6       WLS(kg/ha)    0.00      5.00     0.10      5.1
#7       WLM(kg/ha)    0.00      5.00     0.10      5.1
#8      WLSL(kg/ha)    0.00      4.00     0.10      4.1
#9      WLSC(kg/ha)    0.00      2.10     0.00      2.1
#10     WLMC(kg/ha)    0.00      2.10     0.00      2.1
#11    WLSLC(kg/ha)    0.00      1.70     0.00      1.7
#12   WLSLNC(kg/ha)    0.00      0.40     0.00      0.4
#13     WBMC(kg/ha)    9.00   1102.10   250.90   1361.9
#14     WHSC(kg/ha)   69.00   8432.00  1920.00  10420.0
#15     WHPC(kg/ha)  146.00  18018.00  4102.00  22266.0
#16      WOC(kg/ha)  224.00  27556.00  6272.00     34.0
#17     WLSN(kg/ha)    0.00      0.00     0.00      0.0
#18     WLMN(kg/ha)    0.00      0.20     0.00      0.2
#19     WBMN(kg/ha)    0.90    110.20    25.10    136.2
#20     WHSN(kg/ha)    7.00    843.00   192.00   1042.0
#21     WHPN(kg/ha)   15.00   1802.00   410.00   2227.0
#22      WON(kg/ha)   22.00   2755.00   627.00   3405.0
#23     CFEM(kg/ha)    0.00       NaN      NaN      NaN
df = df.loc[:,'TOT']
print df
#0         NaN
#1         NaN
#2         NaN
#3         NaN
#4         NaN
#5         NaN
#6         5.1
#7         5.1
#8         4.1
#9         2.1
#10        2.1
#11        1.7
#12        0.4
#13     1361.9
#14    10420.0
#15    22266.0
#16       34.0
#17        0.0
#18        0.2
#19      136.2
#20     1042.0
#21     2227.0
#22     3405.0
#23        NaN

编辑:
如果文件中没有重复数据,并且列之间的空格更多为一个空格(则分隔符为 \s\s+):

import pandas as pd

#parse data to dataframe df
#sep - http://stackoverflow.com/a/1546245/2901002
df = pd.read_table('test/file.txt', 
                   sep = '\s\s+', 
                   skiprows = 3,
                   skip_footer = 1,
                   header=None,
                   index_col=[0],
                   engine = 'python',
                   names=['i','1','2','3','TOT']
                    )
print df
df = df['TOT']
print df

关于python - 将列分配给由字符串构造的 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33815944/

相关文章:

python - 你如何在 Python 中测试 file.read() 错误?

python - 列出pandas数据框

python - 如何在数据框中正确设置 Pandas 日期时间对象的 Datetimeindex?

Python 对 pandas 数据框中的单词进行单数化

python - Python 中数据透视表列之间的差异

python - 绘制(Cormen)红黑树插入时的奇怪结果

python - 当我在Python中发出post请求时,如何调用函数?

python - 使用 value_counts() 查找 pandas 中的类准确性

excel - 使用 StyleFrame 的 to_excel 方法将多个 python 数据帧复制到 Excel 中

python - 在 Python 3.6 中计算多边形和 shapefile 之间的重叠