我认为我对字符串替换的理解中缺少一些东西。我们提前感谢您的帮助。
我有一个类似于下面的数据帧:
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