我有一个很长的系列,如下所示:
series = pd.Series([[(1,2)],[(3,5)],[],[(3,5)]])
In [151]: series
Out[151]:
0 [(1, 2)]
1 [(3, 5)]
2 []
3 [(3, 5)]
dtype: object我想删除列表为空的所有条目。由于某些原因,布尔索引不起作用。
下面的两个测试都给出了相同的错误:
series == [[(1,2)]]
series == [(1,2)]
ValueError: Arrays were different lengths: 4 vs 1这非常奇怪,因为在下面的简单示例中,索引的工作原理与上面一样:
In [146]: pd.Series([1,2,3]) == [3]
Out[146]:
0 False
1 False
2 True
dtype: bool另外,理想情况下,我还希望将该系列中的元组拆分为两列的DataFrame。
发布于 2015-03-17 21:40:57
您可以使用str.len()检查列表是否为空
series.str.len() == 0然后使用这个布尔序列删除包含空列表的行。
如果您的每个条目都是一个包含两个元组的列表(否则为空),则可以通过使用两次str访问器来创建一个两列的DataFrame (一次用于选择列表的第一个元素,然后访问元组的元素):
pd.DataFrame({'a': series.str[0].str[0], 'b': series.str[0].str[1]})对于此方法,缺少的条目默认为NaN。
发布于 2015-03-17 21:43:23
您的series处于一种糟糕的状态--拥有一系列int的元组列表会将有用的数据int埋没在太多的容器层中。
但是,要形成所需的DataFrame,您可以使用
df = series.apply(lambda x: pd.Series(x[0]) if x else pd.Series()).dropna()哪一项会产生
0 1
0 1 2
1 3 5
2 3 5一种更好的方法是避免完全构建格式错误的series,直接从数据形成df:
data = [[(1,2)],[(3,5)],[],[(3,5)]]
data = [pair for row in data for pair in row]
df = pd.DataFrame(data)发布于 2017-08-30 23:58:00
使用内置应用,您可以根据列表的长度进行过滤:
series = pd.Series([[(1,2)],[(3,5)],[],[(3,5)]])
series = series[series.apply(len) > 0]https://stackoverflow.com/questions/29100380
复制相似问题