Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas:从Pandas数据框中选择时,字典列表的行为类似于字符串列表_Python_Pandas - Fatal编程技术网

Python Pandas:从Pandas数据框中选择时,字典列表的行为类似于字符串列表

Python Pandas:从Pandas数据框中选择时,字典列表的行为类似于字符串列表,python,pandas,Python,Pandas,假设我从一个csv文件中读取数据,结果创建了一个熊猫数据框,例如,第一行如下所示: id keywords 0 [{'key1': 'string'}, {'key2': 'string2'}, {'key3': 'string3'}] 所以,当我第一次看到这些数据时,我认为这是一个字典列表。当我检查类型时,它实际上是一个字符串列表。因此,我无法执行类似于list['key1']的操作来选择key1的值 我还应该提到,我正在使用下面的代码读取文件并获取数据帧的第一行: d

假设我从一个csv文件中读取数据,结果创建了一个熊猫数据框,例如,第一行如下所示:

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要将字符串转换为字典,它在您的示例中对我有效,您能告诉我您遇到了什么错误或什么不起作用吗?