我正在尝试用NaN值替换数据中的一些空列表。但是如何在表达式中表示一个空列表?
import numpy as np
import pandas as pd
d = pd.DataFrame({'x' : [[1,2,3], [1,2], ["text"], []], 'y' : [1,2,3,4]})
d
x y
0 [1, 2, 3] 1
1 [1, 2] 2
2 [text] 3
3 [] 4
d.loc[d['x'] == [],['x']] = d.loc[d['x'] == [],'x'].apply(lambda x: np.nan)
d
ValueError: Arrays were different lengths: 4 vs 0
而且,我希望[text]
使用d[d['x'] == ["text"]]
错误选择ValueError: Arrays were different lengths: 4 vs 1
,但使用3
选择d[d['y'] == 3]
是正确的。为什么呢?
答案 0 :(得分:9)
如果您希望将x
列中的空列表替换为numpy nan
,则可以执行以下操作:
d.x = d.x.apply(lambda y: np.nan if len(y)==0 else y)
如果要在等于['text']
的行上对数据框进行子集化,请尝试以下操作:
d[[y==['text'] for y in d.x]]
我希望这会有所帮助。
答案 1 :(得分:1)
要回答您的主要问题,请完全忽略空列表。如果您使用pandas.concat而不是从字典构建数据框,那么如果一列中有值而另一列中没有值,NaN会自动填充。
>>> import pandas as pd
>>> ser1 = pd.Series([[1,2,3], [1,2], ["text"]], name='x')
>>> ser2 = pd.Series([1,2,3,4], name='y')
>>> result = pd.concat([ser1, ser2], axis=1)
>>> result
x y
0 [1, 2, 3] 1
1 [1, 2] 2
2 [text] 3
3 NaN 4
关于你的第二个问题,似乎你无法搜索元素内部。也许你应该把它作为一个单独的问题,因为它与你的主要问题没有关系。
答案 2 :(得分:1)
您可以使用“apply”函数来匹配指定的单元格值,无论它是字符串,列表等的实例。
例如,在您的情况下:
import pandas as pd
d = pd.DataFrame({'x' : [[1,2,3], [1,2], ["text"], []], 'y' : [1,2,3,4]})
d
x y
0 [1, 2, 3] 1
1 [1, 2] 2
2 [text] 3
3 [] 4
如果您使用d == 3
选择值为3的单元格,则完全可以:
x y
0 False False
1 False False
2 False True
3 False False
但是,如果您使用等号来匹配列表,则可能会超出您的例外情况,例如d == [text]
或d == ['text']
或d == '[text]'
,例如:
enter image description here
有一些解决方案:
apply()
,就像顶部的答案一样:在Dataframe上使用函数applymap()
的更通用方法可用于预处理步骤:
d.applymap(lambda x:x == [])
x y
0错误 1假错 2假错 3正确错误
希望它可以帮助您和以下学习者,如果您在applymap
函数中添加类型检查会更好,否则可能会导致一些异常。