Python 3.x 熊猫:单元格列表中的每个值都要小写

Python 3.x 熊猫:单元格列表中的每个值都要小写,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我有一个这样的数据帧 # 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

我有一个这样的数据帧

# 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

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

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
过滤的
列表

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

你必须避开
NaN
,看看。如果x是np.NaN,你可以使用
lambda x:np.NaN,否则[item.lower()表示x中的项]
。亨利,你的答案是正确的,如果您能将其作为answer@Max我犯了什么错误我也犯了这个错误-
TypeError:“float”对象不可编辑
我也犯了这个错误-
TypeError:“float”对象不可编辑
@HardikGupta-问题在于样本数据?问题在于我的数据,而不是样本数据,我无法复制我拥有的列表,它将其标识为float,而不是floatlist@HardikGupta-因此需要将
f=lambda x:[item.lower()用于x中的项]如果isinstance(x,list)else np.nan
更改为
f=lambda x:[item.lower()用于x中的项]如果不是isinstance(x,float)else np.nan