我有一个数据框 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个元素(而非全部)运行该方法时,上述恰好方法有效。我有点困惑。
我想念什么?有什么想法吗?
答案 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”开头“。