Pandas DataFrame将列表存储为字符串:如何转换回列表?

2024-05-23 20:01:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个n-by-mPandas数据帧{},定义如下。(我知道这不是最好的方法。这对我在实际代码中所做的工作是有意义的,但这篇文章的主题是TMI,所以请相信我的话,这种方法在我的特定场景中是有效的。)

>>> df = DataFrame(columns=['col1'])
>>> df.append(Series([None]), ignore_index=True)
>>> df
Empty DataFrame
Columns: [col1]
Index: []

我将列表存储在这个数据框的单元格中,如下所示。

>>> df['column1'][0] = [1.23, 2.34]
>>> df
     col1
0  [1, 2]

出于某种原因,数据帧将此列表存储为字符串而不是列表。

>>> df['column1'][0]
'[1.23, 2.34]'

我有两个问题要问你。

  1. 为什么DataFrame将一个列表存储为一个字符串,是否有办法避免这种行为?
  2. 如果不是,那么有没有一种Pythonic方法可以将此字符串转换为列表?

更新

我正在使用的数据帧已从CSV格式保存和加载。这种格式,而不是数据帧本身,将列表从字符串转换为文本。


Tags: 数据方法字符串代码dataframedf列表by
3条回答

1)有办法避免这种行为。这里使用loc帮助。

>>> import pandas as pd

>>> df = pd.DataFrame(columns=['column1'])
>>> df = df.append(pd.Series(data = {'column1':[None]}), ignore_index = True)

   column1
0  [None]

>>> # Add list to index 0 in column1
>>> df.loc[0,'column1'] = [1.23, 2.34]
>>> print(df.loc[0, 'column1'])
[1.23, 2.34]

2)将此字符串转换为列表的Pythonic方法。(这可能是您想要的,因为您正在使用的数据帧已经从CSV格式保存和加载,有两种解决方案)。这是对pshep123答案的补充。

from ast import literal_eval
import pandas as pd

csv = io.StringIO(u'''
id  list
A1  [1,2]
A2  [3,4]
A3  [5,6]
''')
df = pd.read_csv(csv, delim_whitespace = True)

# Output is a string
df.loc[0, 'list']
'[1,2]'

# Convert entire column to a list
df.loc[:,'list'] = df.loc[:,'list'].apply(lambda x: literal_eval(x))

# Output is a list
df.loc[0, 'list']
[1, 2]

我刚刚遇到这个问题,有一个非常简单的解决方案(pandas.eval())。我用的是熊猫0.20.0。

# SETUP
import pandas as pd
import io

csv = io.StringIO(u'''
id  list
A1  [1,2]
A2  [3,4]
A3  [5,6]
''')

df = pd.read_csv(csv, delim_whitespace = True)

# TYPE CHECK <type 'str'>
print type(df.at[0, 'list'])

# MAIN CONVERSION
df['list'] = pd.eval(df['list'])

# TYPE CHECK <type 'list'>
print type(df.at[0, 'list'])

正如您所指出的,当将pandas数据帧保存和加载为.csv文件(文本格式)时,通常会发生这种情况。

在您的例子中,这是因为列表对象有一个字符串表示,允许它们存储为.csv文件。加载.csv将生成该字符串表示。

如果要存储实际的对象,应该使用DataFrame.to_pickle()(注意:对象必须是可挑选的!)。

要回答第二个问题,可以使用^{}将其转换回:

>>> from ast import literal_eval
>>> literal_eval('[1.23, 2.34]')
[1.23, 2.34]

相关问题 更多 >