Python Pandas:从Pandas数据框中选择时,字典列表的行为类似于字符串列表
假设我从一个csv文件中读取数据,结果创建了一个熊猫数据框,例如,第一行如下所示:Python Pandas:从Pandas数据框中选择时,字典列表的行为类似于字符串列表,python,pandas,Python,Pandas,假设我从一个csv文件中读取数据,结果创建了一个熊猫数据框,例如,第一行如下所示: id keywords 0 [{'key1': 'string'}, {'key2': 'string2'}, {'key3': 'string3'}] 所以,当我第一次看到这些数据时,我认为这是一个字典列表。当我检查类型时,它实际上是一个字符串列表。因此,我无法执行类似于list['key1']的操作来选择key1的值 我还应该提到,我正在使用下面的代码读取文件并获取数据帧的第一行: d
id keywords
0 [{'key1': 'string'}, {'key2': 'string2'}, {'key3': 'string3'}]
所以,当我第一次看到这些数据时,我认为这是一个字典列表。当我检查类型时,它实际上是一个字符串列表。因此,我无法执行类似于list['key1']
的操作来选择key1
的值
我还应该提到,我正在使用下面的代码读取文件并获取数据帧的第一行:
df = pd.read_csv(filepath, sep='|')
keywords = df["keywords"].tolist()
关键字
的输出如下:
id keywords
0 [{'key1': 'string'}, {'key2': 'string2'}, {'key3': 'string3'}]
[{'key1':'string'},{'key2':'string2'},{'key3':'string3'}]
这和第一排完全一样
我的问题是,如何提取key1
的值?我不能使用关键字['key1']
,因为它给了我类型错误:字符串索引必须是整数。例如,我尝试了关键字[0]
,但没有成功。那么,这里有什么问题
编辑:我想出了一个解决方案,但作为一个大傻瓜,我无意中删除了自己的代码。。。我所做的是先删除括号,然后使用split(',')
并获取第一个元素,例如,如果我试图选择string1
。在那之后,我将{'key1':'string'}
作为第一个元素,然后删除花括号并使用split(':')
。这一次,我选择了最后一个元素,即'string'
,并删除了'
字符
一旦我有空,我会把代码贴在这里。这可能对其他人有帮助。最快且非通用的方法是键入关键字[0][“key1”]
我将使用一个简单的函数,它将请求的键作为参数并返回相关值
迭代列表中的每个元素,对于作为dict的每个元素,迭代项目(您只有一个,但此解决方案支持更多),并在接近它时返回键的值
一个简单的实现:
keywords = [{'key1': 'string'}, {'key2': 'string2'}, {'key3': 'string3'}]
def find_by_key(key):
for elem in keywords:
for k,v in elem.items():
if k == key:
return elem[k]
print (find_by_key("key1"))
>>> 'string'
我不确定这是否正是您所期望的,但您可以这样做:
eval(df['keywords'][0])[0]['key1']
通过这种方式,您可以从第一行提取它,如果您想将其应用于所有行,只需执行以下操作:
df.apply(lambda x: eval(x['keywords'])[0]['key1'], axis=1)
也可以将其指定给新列
df['key1'] = df.apply(lambda x: eval(x['keywords'])[0]['key1'], axis=1)
感谢您花时间回答!遗憾的是,这不起作用。正如我在问题中所说,关键字
看起来像一个字典列表,但它基本上是一个字符串列表。因此,我不能使用键
或类似的东西。感谢您抽出时间回答!这不起作用,因为它不是字典列表。它基本上是一个字符串列表,我不能使用键值。还有一个简单的问题:为什么要使用eval
?我见过很多人用eval
警告其他人,因为这有点危险,尽管我不知道原因。eval要将字符串转换为字典,它在您的示例中对我有效,您能告诉我您遇到了什么错误或什么不起作用吗?