2

我有一个有 4 列的数据框..

A    B     C      D
e    2     =     <0.1
e    2     =     <0.11
e    2     =      0.1
e    2     =      0.1
e    2     =      0.1
e    2     =     <0.14

D 列有一些以“<”开头的浮点值,有些没有“<”。

对于前面有“<”的行,我想将其剪切并移到“=”符号之前的 C 列。

我该怎么做?

如果我使用普通切片,它将削减没有“<”符号的值。

并且startswith不适用于浮点值。

4

2 回答 2

0

您可以创建一个函数,该函数在df.D列中输入一个条目并返回一个系列。然后您可以将 Seriesapply与此功能一起使用:

def f(d):
    try:
        if d[0] == '<':
            return pd.Series(['<=', float(d[1:])])
    except TypeError:
        return pd.Series(['==', d])

In [9]: df = DataFrame({'A': {0: 'e', 1: 'e', 2: 'e', 3: 'e', 4: 'e', 5: 'e'}, 'B': {0: 2, 1: 2, 2: 2, 3: 2, 4: 2, 5: 2}, 'C': {0: '=', 1: '=', 2: '=', 3: '=', 4: '=', 5: '='}, 'D': {0: '<0.1', 1: '<0.11', 2: 0.1, 3: 0.1, 4: 0.1, 5: '<0.14'}})

In [10]: df
Out[10]: 
   A  B  C      D
0  e  2  =   <0.1
1  e  2  =  <0.11
2  e  2  =    0.1
3  e  2  =    0.1
4  e  2  =    0.1
5  e  2  =  <0.14

In [11]: df[['C', 'D']] = df.D.apply(f)

In [12]: df
Out[12]: 
   A  B   C     D
0  e  2  <=   0.1
1  e  2  <=  0.11
2  e  2  ==   0.1
3  e  2  ==   0.1
4  e  2  ==   0.1
5  e  2  <=  0.14
于 2013-01-07T14:10:57.290 回答
0

如果我理解正确的话,这样的事情应该可以做到。这是非常快速和肮脏的,未经测试。读取命名文件,打印到标准输出:

for l in open("file.txt").readlines():
  l = l.strip()
  fields = l.split(" ")
  if len(fields) != 4: continue
  if fields[3][0] == "<":
    fields[2] = "<"
    fields[3] = fields[3][1:]
  print "\t".join(fields)
于 2013-01-07T13:53:26.880 回答