布尔索引将False-y值保留为NaN(Pandas)

cs9*_*s95 4 python nan dataframe pandas

给定一个数据帧:

                         Data
1                      246804
2                      135272
3                      898.01
4                     3453.33
5                       shine  
6                        add
7                         522
8                         Nan
9                      string
10                      29.11
11                        20  
Run Code Online (Sandbox Code Playgroud)

我想两个新列FloatsStrings,两者具有相同长度的原始数据帧.获取Floats专栏很简单:

In [176]: pd.to_numeric(df.Data, errors='coerce')
Out[176]: 
1     246804.00
2     135272.00
3        898.01
4       3453.33
5           NaN
6           NaN
7        522.00
8           NaN
9           NaN
10        29.11
11        20.00
Name: Data, dtype: float64
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,非浮动被强迫NaN,这正是我想要的.

为了得到字符串,我就是这样做的:

In [177]: df[df.Data.str.isalpha()]
Out[177]: 
     Data
5   shine
6     add
8     Nan
9  string
Run Code Online (Sandbox Code Playgroud)

但正如您所看到的,它不会将非String值保留为NaN.我想要这样的东西:

1                       NaN
2                       NaN
3                       NaN
4                       NaN
5                       shine  
6                       add
7                       NaN
8                       Nan (not NaN)
9                       string
10                      NaN
11                      NaN  
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

Ale*_*der 5

要获取Strings,您可以在Data列上使用布尔索引并找到Floatsnull的位置.

df['Floats'] = pd.to_numeric(df.Data, errors='coerce')
df['Strings'] = df.Data.loc[df.Floats.isnull()]  # Optional: .astype(str)

>>> df
# Output:
#        Data     Floats Strings
# 1    246804  246804.00     NaN
# 2    135272  135272.00     NaN
# 3    898.01     898.01     NaN
# 4   3453.33    3453.33     NaN
# 5     shine        NaN   shine
# 6       add        NaN     add
# 7       522     522.00     NaN
# 8       Nan        NaN     Nan
# 9    string        NaN  string
# 10    29.11      29.11     NaN
# 11       20      20.00     NaN
Run Code Online (Sandbox Code Playgroud)