将混合字符串中的字符串移动并浮动列到Pandas中的新列

时间:2018-08-16 18:47:17

标签: pandas

似乎在任何地方都找不到答案。我的数据框中有一个同时包含字符串和浮点数的列“ q”。我想从“ q”中删除字符串值,并将其移至现有的字符串列“ comments”中。任何帮助表示赞赏。

我尝试过:

getch()

我也尝试过对q的一些str方法,但无济于事。对此的任何指示将不胜感激

2 个答案:

答案 0 :(得分:0)

如果系列是:

s=pd.Series([1.0,1.1,1.2,1.3,'this','is',1.4,'a',1.5,'comment'])
s
Out[24]: 
0          1
1        1.1
2        1.2
3        1.3
4       this
5         is
6        1.4
7          a
8        1.5
9    comment
dtype: object

那么唯一的浮点数可以是:

[e if type(e) is float else np.NaN for e in s if type(e)]
Out[25]: [1.0, 1.1, 1.2, 1.3, nan, nan, 1.4, nan, 1.5, nan]

注释可以是:

[e if type(e) is not float else '' for e in s if type(e)]
Out[26]: ['', '', '', '', 'this', 'is', '', 'a', '', 'comment']

这就是您想要做的。

但是使用pandas进行逐元素迭代的缩放效果不好,因此只能使用以下方法提取浮点数:

pd.to_numeric(s,errors='coerce')
Out[27]: 
0    1.0
1    1.1
2    1.2
3    1.3
4    NaN
5    NaN
6    1.4
7    NaN
8    1.5
9    NaN
dtype: float64

和:

pd.to_numeric(s,errors='coerce').to_frame('floats').merge(s.loc[pd.to_numeric(s,errors='coerce').isnull()].to_frame('comments'), left_index=True, right_index=True, how='outer')
Out[71]: 
   floats comments
0     1.0      NaN
1     1.1      NaN
2     1.2      NaN
3     1.3      NaN
4     NaN     this
5     NaN       is
6     1.4      NaN
7     NaN        a
8     1.5      NaN
9     NaN  comment

pd.to_numeric(s,errors='coerce')有一个副作用,它将把所有带有float文字的字符串转换为float,而不是将其保留为字符串。

pd.to_numeric(pd.Series([1.0,1.1,1.2,1.3,'this','is',1.4,'a',1.5,'comment','12.345']), errors='coerce')
Out[73]: 
0      1.000
1      1.100
2      1.200
3      1.300
4        NaN
5        NaN
6      1.400
7        NaN
8      1.500
9        NaN
10    12.345   <--- this is now the float 12.345 not str
dtype: float64

答案 1 :(得分:0)

如果您不想将带有float文字的字符串转换为float,也可以使用str.isnumeric()方法:

df = pd.DataFrame({'q':[1.5,2.5,3.5,'a', 'b', 5.1,'3.55','1.44']})

df['comments'] = df.loc[df['q'].str.isnumeric()==False, 'q']

In [4]: df
Out[4]: 
      q comments
0   1.5      NaN
1   2.5      NaN
2   3.5      NaN
3     a        a
4     b        b
5   5.1      NaN
6  3.55     3.55  <-- strings are not converted into floats
7  1.44     1.44

或者类似这样的东西:

criterion = df.q.apply(lambda x: isinstance(x,str))
df['comments'] = df.loc[criterion, 'q']

同样,它不会将字符串转换为浮点数。