pd.Series字符串替换意外修改值



我认为我对字符串替换的理解中缺少一些东西。我们提前感谢您的帮助。

我有一个类似于下面的数据帧:

combine_cols = pd.DataFrame({'totalannualmembers' : [85494.0, np.NaN, np.NaN], 
'totalannualmembershipssold' : [np.NaN, 90000.0, np.NaN]})

我想将这两列合并或组合成一列。为此,我将NaN替换为空字符串,并将列转换为str类型。下面的代码组合了这两列。

join_cols = ['totalannualmembers', 'totalannualmembershipssold']
#fill NaN with empty string
combine_cols.fillna('', axis = 1, inplace = True)
#convert columns to str type
combine_cols = combine_cols[join_cols].astype(str)
#combine into a single column
combine_cols['combine_test'] = combine_cols['totalannualmembers'].str.cat(combine_cols['totalannualmembershipssold'],sep="")

由于空字符串,当我试图将combine_cols.combine_test列转换回整数/浮点类型时,就会出现问题。我尝试用以下内容替换空字符串:

combine_cols.combine_test = combine_cols.combine_test.str.replace('', '9999')

虽然这改变了空字符串,但似乎也改变了我想要保留的值。例如,当期望输出保持为85494.0时,combine_test索引550也改变。

combine_cols.iloc[550]
---------------------------------------------------------------------------
totalannualmembers                                            85494.0
totalannualmembershipssold                                           
combine_test                  99998999959999499999999949999.999909999
Name: 550, dtype: object

有没有更好的方法将这两列合并为一列,或者转换空字符串,以便将列转换回浮点类型进行分析?

combine_cols.combine_test的期望输出为:

0       85494.0
1       90000.0
2       NaN

您可以使用fillna:

combine_cols['combine_test'] = (combine_cols['totalannualmembers']
.fillna(combine_cols.totalannualmembershipssold)
)

输出:

totalannualmembers  totalannualmembershipssold  combine_test
0             85494.0                         NaN       85494.0
1                 NaN                     90000.0       90000.0
2                 NaN                         NaN           NaN

我相信您必须遵循的方法是:

combine_cols.combine_test[combine_cols.combine_test == ""] = "9999"

对于combine_cols.combine_test[combine_cols.combine_test == ""],我们要求数据帧只搜索combine_test列上与空字符串匹配的行,并将其替换为字符串"9999">

如果这有帮助,请告诉我:D!

您的解决方案似乎太复杂了,不适合您对我做什么。你可能只是想做…

另外,由于你不处理字符串。。。它一定更快。

combine_cols = pd.DataFrame({
'totalannualmembers' : [85494.0, np.NaN, np.NaN], 
'totalannualmembershipssold' : [np.NaN, 90000.0, np.NaN]
})
combine_cols['test'] = combine_cols.loc[:, 'totalannualmembers']
mask = combine_cols['totalannualmembers'].isna()
combine_cols.loc[mask, 'test'] = combine_cols.loc[mask, 'totalannualmembershipssold']
print(combine_cols)
# 0             85494.0                         NaN  85494.0
# 1                 NaN                     90000.0  90000.0
# 2                 NaN                         NaN      NaN

一种更"有趣"的方法:(如果您在创建数据帧后寻找一个单行。

combine_cols.melt(value_name='combine_test').drop('variable', axis=1).drop_duplicates().reset_index(drop=True)

1( 将列融化为一个组合列,列标题移动到行中,并将列命名为"combine_test">

2( 删除不必要的"变量"列,该列是在列标题因融化而变成行的位置创建的。

3( 删除重复的行并将索引重置为0、1、2,然后传递Drop=True以避免在重置后添加新列。

试着使用pandas.contat((,看看它是否适合你。我还使用panda删除了所有缺失的值。dropna((和使用panda重新设定索引种子。DataFrame.reset_index.

combine_cols = pd.concat([combine_cols['totalannualmembers'],combine_cols['totalannualmembershipssold']], ignore_index=True)
combine_cols.dropna(inplace=True)
combine_cols.reset_index(drop=True, inplace=True)
print(combine_cols)

其输出应为:

0    85494.0
1    90000.0
dtype: float64

查看这些网站了解更多信息:

[1]https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html

[2]https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html

[3]https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reset_index.html

最新更新