天天看點

pandas_dataframe元素類型轉換并集操作/差集操作/bool&str混合資料類型排序問題/TypeError:unsupported operand type(s)

文章目錄

  • ​​pandas_dataframe元素類型轉換并集操作/差集操作//bool&str混合資料類型排序問題​​
  • ​​TypeError: unsupported operand type(s) for +: 'bool' and 'str'​​
  • ​​datafram資料類型轉化​​
  • ​​astypes函數​​
  • ​​map(applymap)+python cast​​
  • ​​并集&差集&索引重建重排序​​
  • ​​reset_index參考​​
  • ​​相關集合論原理​​

pandas_dataframe元素類型轉換并集操作/差集操作//bool&str混合資料類型排序問題

TypeError: unsupported operand type(s) for +: ‘bool’ and ‘str’

  • 排序中,可能遇到類似的報錯,我們可以嘗試通過資料類型轉換來解決

datafram資料類型轉化

某些時候,我們的資料中包含了一些特殊值,其類型容易被pandas識别為其他(譬如從str被識别為bool類型)
  • 錯誤類型
  • ​ TypeError : unsupported operand type(s) for +: 'bool' and 'str'​

astypes函數

  • ​​pandas.DataFrame.astype — pandas 1.4.2 documentation (pydata.org)​​
  • 這個方案感覺不是很通用(複雜情況下的實踐)

map(applymap)+python cast

  • ​​pandas.DataFrame.applymap ​​
這個方案比較靠譜
# 将所有元素類型通過python元素類型強制轉化,轉換為str類型
df3=df3.applymap(lambda x:str(x))
# 這個時候再執行列上的元素排序不會出現資料類型不同的問題!
df3.sort_values(by='spelling')      

并集&差集&索引重建重排序

  • 以下代碼時候再jupyter方式運作檢視
  • dataframe可以自己構造的對象
  • concat()
  • drop_duplicate()
# 并集(去重)(得到原生不重複的全集)
set_union_df=pd.concat([old_df,new_df]).drop_duplicates()
set_union_df
# 根據資料列重新産生(重建立立索引并排序:reset_index(drop=True));
# 或者不用drop參數,直接截取指定列(舊有的索引列自然會被去掉!)
# set_union_df=set_union_df.reset_index()[['spelling']]
# 差集(基于全集的去重操作;求取獨有的那部分元素)
##
# 注意concat(的參數)&drop_duplicates(的參數keep)
set_diff_df=pd.concat([set_union_df,old_df]).drop_duplicates(keep=False)
set_diff_df=set_diff_df.reset_index()[['spelling']]
set_diff_df      

reset_index參考

  • ​​pandas.DataFrame.reset_index​​

相關集合論原理

# try diff compare(optional):以下是差集和pandas方法的推演
s1=pd.Series([2,3,4,5])
s1
df1=pd.DataFrame(s1)
s2=pd.Series([1,3,4,5])
df2=pd.DataFrame(s2)
set_union_df = pd.concat([df2, df1]).drop_duplicates()
set_union_df
#集合論中: A-B=A-AB
# 我們可以利用concat(A+B,B).drop_duplicates(keep=False)得到類似效果
# df2-df1
set_diff_df=pd.concat([set_union_df,df1]).drop_duplicates(keep=False)
set_diff_df
#df1-df2
set_diff_df=pd.concat([set_union_df,df2]).drop_duplicates(keep=False)
set_diff_df
print(set_union_df)