python - 替换 pandas dataframe 中的值时出现 str 错误

标签 python pandas

我的代码从网站上抓取信息并将其放入数据框中。但我不确定为什么代码的顺序会引起错误: AttributeError: Can only use .str accessor with string value, which use np.object_ dtype in pandas

基本上,抓取的数据有20行10列以上。

  • 一些值在括号内即:(2,333),我想将其更改为:-2333
  • 某些值包含单词 n.a,我想将其更改为 numpy.nan
  • 一些值是 -,我也想将它们更改为 numpy.nan

不起作用

for final_df, engine_name in zip((df_foo, df_bar, df_far), (['engine_foo', 'engine_bar', 'engine_far'])):

# Replacing necessary items for final clean up

    final_df.replace('-', numpy.nan, inplace=True)
    final_df.replace('n.a.', numpy.nan, inplace=True)

    for i in final_df.columns:
        final_df[i] = final_df[i].str.replace(')', '')
        final_df[i] = final_df[i].str.replace(',', '')
        final_df[i] = final_df[i].str.replace('(', '-')

    # Appending Code to dataframe
    final_df = final_df.T
    final_df.insert(loc=0, column='Code', value=some_code)

# This produces the error - AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

作品

for final_df, engine_name in zip((df_foo, df_bar, df_far), (['engine_foo', 'engine_bar', 'engine_far'])):

# Replacing necessary items for final clean up

    for i in final_df.columns:
        final_df[i] = final_df[i].str.replace(')', '')
        final_df[i] = final_df[i].str.replace(',', '')
        final_df[i] = final_df[i].str.replace('(', '-')

    final_df.replace('-', numpy.nan, inplace=True)
    final_df.replace('n.a.', numpy.nan, inplace=True)

    # Appending Code to dataframe
    final_df = final_df.T
    final_df.insert(loc=0, column='Code', value=some_code)

# This doesn't give me any errors and returns me what I want. 

对于为什么会发生这种情况有什么想法吗?

最佳答案

对我来说工作双 replace - 首先使用 regex=True 替换子字符串,第二个替换所有值:

np.random.seed(23)
df = pd.DataFrame(np.random.choice(['(2,333)','n.a.','-',2.34], size=(3,3)), 
                  columns=list('ABC'))
print (df)
      A     B        C
0  2.34     -  (2,333)
1  n.a.     -  (2,333)
2  2.34  n.a.  (2,333)

df1 = df.replace(['\(','\)','\,'], ['-','',''], regex=True).replace(['-','n.a.'], np.nan)
print(df1)
      A   B      C
0  2.34 NaN  -2333
1   NaN NaN  -2333
2  2.34 NaN  -2333

df1 = df.replace(['-','n.a.'], np.nan).replace(['\(','\)','\,'], ['-','',''], regex=True)
print(df1)  
      A   B      C
0  2.34 NaN  -2333
1   NaN NaN  -2333
2  2.34 NaN  -2333

编辑:

您的错误意味着您希望将某些非字符串列(例如,B 列中的所有列均为 NaN)替换为 str.replace :

df1 = df.apply(lambda x: x.str.replace('\(','-').str.replace('\)','')
                           .str.replace(',','')).replace(['-','n.a.'], np.nan)
print(df1)
      A   B      C
0  2.34 NaN  -2333
1   NaN NaN  -2333
2  2.34 NaN  -2333 
<小时/>
df1 = df.replace(['-','n.a.'], np.nan)
       .apply(lambda x: x.str.replace('\(','-')
                         .str.replace('\)','')
                         .str.replace(',',''))
print(df1)

AttributeError: ('Can only use .str accessor with string values, which use np.object_ dtype in pandas', 'occurred at index B')

dtype B 列的值为 float64:

df1 = df.replace(['-','n.a.'], np.nan)
print(df1)
      A   B        C
0  2.34 NaN  (2,333)
1   NaN NaN  (2,333)
2  2.34 NaN  (2,333)

print (df1.dtypes)
A     object
B    float64
C     object
dtype: object

关于python - 替换 pandas dataframe 中的值时出现 str 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44994437/

相关文章:

python - pandas 将范围内的值分配给类别

python - Pandas 数据框中的可变移位

python - 地理 Pandas 不会爆炸

python - 如何提高神经网络的准确性

python - 检查类属性是否在给定类中定义或派生

python - 根据移动设备与桌面优化 Django WebApp 的显示

python - 如何根据Python中的列值创建自定义数据框?

Python - 对 pandas 数据框中的两行应用 concat 函数

Python多重继承中的错误 "TypeError: could not convert X to Y"

python - Pandas:用 groupby 中的日期重新索引,根据需要填充/维护值