我正在尝试用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]
是正确的。为什么?
如果您希望使用numpy x
替换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]]
我希望这有帮助。
要回答您的主要问题,请完全忽略空列表。如果您使用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
关于你的第二个问题,似乎你无法搜索元素内部。也许你应该把它作为一个单独的问题,因为它与你的主要问题没有关系。
您可以使用函数“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()
,就像顶部的答案一样:applymap()
函数的更通用方法可用于预处理步骤:
d.applymap(lambda x:x == [])
x y
0 False False 1 False False 2 False False 3 True False希望它可以帮助你和下面的学习者,如果你在applymap
函数中添加一个类型检查会更好,否则可能会导致一些异常。