从另一个数据框列创建新数据框时出错

时间:2019-05-22 15:05:25

标签: python pandas

我有一个数据框 A ,如下所示:

|                                        info                                       |
|[ {"key1": "random_value1", "key2": "random_value2", ..., "keyn": "random_valuen"}] |
|[ {"key1": "random_value1", "key2": "random_value2", ..., "keyn": "random_valuen"}] |
|...................................................................................|
|[ {"key1": "random_value1", "key2": "random_value2", ..., "keyn": "random_valuen"}] |

我正在尝试使用某些值创建一个新的数据框,因此我需要执行以下操作:

B = A.loc[A["info"][0][key3].startswith("foobar")]

我得到以下信息:

TypeError: list indices must be integers or slices, not str

从错误中我了解到它不喜欢key3,但我不知道为什么。

我也尝试过:

B = pandas.DataFrame(columns=["new_info"]
B["new_info"] = [element[0][key3] for element in A["info"] if element[0][key3].startswith("foobar")]

我收到以下错误:

IndexError: list index out of range

我不知道这是否也有帮助,但是当我为列的前10个元素(而非全部)运行该方法时,上述恰好方法有效。我有点困惑。

我想念什么?有什么想法吗?

2 个答案:

答案 0 :(得分:0)

IIUC数据的结构(作为一列的每个单元格中的列表中的字典),每次要访问嵌套元素时,都需要在该系列上使用方法str

# example
A = pd.DataFrame({'info': [[ {"no": "random_value1", "yeah": "random_value2",}], 
                           [ {"no": "random_value1", "yeah": "foobar2",}]],
                  'other_col': [1,2]})
key3 = 'yeah'

如果您执行print (A["info"].str[0].str[key3].str.startswith("foobar")),则会得到您要查找的掩码(请注意,每次需要str来访问嵌套单元格中的元素时,请注意

最后,对于B,您可以执行以下操作:

B = A.loc[A["info"].str[0].str[key3].str.startswith("foobar")]
print (B) #you get just the second row as expected
                                           info  other_col
1  [{'no': 'random_value1', 'yeah': 'foobar2'}]          2

答案 1 :(得分:0)

所以错误与我预期的完全不同。

对于数据集的某些行,列表为空,因此:

B = pandas.DataFrame(columns=["new_info"]
B["new_info"] = [element[0][key3] for element in A["info"] if element[0][key3].startswith("foobar")]

将失败,因为元素[0]不存在。

添加条件if element来检查列表是否为空即可。

但是再一次,它需要结合另一个答案中提到的str

最后我选择了一种简单的for循环方式,因为我有两个条件无法在df.loc中实现,请检查列表中是否至少包含1个元素,然后以“ foobar”开头“。