【问题标题】:Pandas: Every value of cell list to lower case熊猫:单元格列表的每个值都小写
【发布时间】:2020-08-19 19:32:45
【问题描述】:

我有一个这样的数据框

# initialize list of lists 
data = [[1, ['ABC', 'pqr']], [2, ['abc', 'XY']], [3, np.nan]] 

# Create the pandas DataFrame 
data = pd.DataFrame(data, columns = ['Name', 'Val'])
data

    Name  Val
0   1     [ABC, pqr]
1   2     [abc, XY]
2   3     NaN

我正在尝试将列表中的每个值都转换为小写

data['Val'] = data['Val'].apply(lambda x: np.nan if len(x) == 0 else [item.lower() for item in x])
data

但是我得到了这个错误

TypeError: object of type 'float' has no len()

预期的最终输出

     Name  Val
0   1     [abc, pqr]
1   2     [abc, xy]
2   3     NaN

【问题讨论】:

  • 你要转义NaN,看看this post
  • 你可以使用lambda x: np.nan if x is np.NaN else [item.lower() for item in x]
  • Henry,你的答案是正确的,如果你能把它写成答案,将不胜感激
  • @Max 我犯了什么错误
  • 我也收到此错误 - TypeError: 'float' object is not iterable

标签: python-3.x pandas dataframe


【解决方案1】:

第一个想法是过滤行而不丢失值和处理:

m = data['Val'].notna()
data.loc[m, 'Val'] = data.loc[m, 'Val'].apply(lambda x: [item.lower() for item in x])
print (data)
   Name         Val
0     1  [abc, pqr]
1     2   [abc, xy]
2     3         NaN

或者你可以只处理被isinstance过滤的lists:

f = lambda x: [item.lower() for item in x] if isinstance(x, list) else np.nan
data['Val'] = data['Val'].apply(f)
print (data)
   Name         Val
0     1  [abc, pqr]
1     2   [abc, xy]
2     3         NaN

【讨论】:

  • 我也收到此错误 - TypeError: 'float' object is not iterable
  • @HardikGupta - 样本数据有问题?
  • 问题在于我的数据,而不是样本数据,我无法重现
  • 我拥有的列表,它将其标识为浮动,而不是列表
  • @HardikGupta - 所以需要将f = lambda x: [item.lower() for item in x] if isinstance(x, list) else np.nan 更改为f = lambda x: [item.lower() for item in x] if not isinstance(x, float) else np.nan 吗?
猜你喜欢
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2018-04-30
  • 2020-09-19
  • 2018-01-24
  • 2022-01-12
相关资源
最近更新 更多