Python 使用生成器表达式将列表系列转换为数据帧

Python 使用生成器表达式将列表系列转换为数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,s是一个系列对象: >>> s 0 [2010, 1] 1 [2011, 5] 2 [2012, 10] dtype: object 然后我遇到了以下内容,它使用生成器表达式将s转换为数据帧 >>> df = pd.DataFrame(i for i in s) >>> df 0 1 0 2010 1 1 2011 5 2 2012 10 有没有解释为什么会这样?我不明白为什么它会起作

s是一个系列对象:

>>> s
0     [2010, 1]
1     [2011, 5]
2    [2012, 10]
dtype: object
然后我遇到了以下内容,它使用生成器表达式将s转换为数据帧

>>> df = pd.DataFrame(i for i in s)
>>> df
      0   1
0  2010   1
1  2011   5
2  2012  10

有没有解释为什么会这样?我不明白为什么它会起作用。

这就是为什么它会起作用。在幕后,
生成器
被转换回
列表
。这里有一大块

对于
列表
也同样适用

# Creating a list
l = [1,2,3]
# Using the generator
df1 = pd.DataFrame(i for i in l)
# Using the list
df2 = pd.DataFrame(l)
df1.equals(df2)
# True

我认为这是最简单的解决方案:

df = pd.DataFrame({'a': [[2010, 1],[2011, 5],[2012, 10]]})

df[['a1', 'a2']] = df['a'].apply(pd.Series)

阅读文档-
“数据:…或类似对象列表”
。所以你可以使用发电机,但你不能总是这样做。例如,传递
zip
map
对象会导致类型错误。@furas文档声明:
“数据:Dict可以包含…或类似列表的对象”
。没有涉及词典,可能没有更新。您可以传递列表、列表列表、元组等。我意识到文档中没有提到可以从列表创建数据帧。
df = pd.DataFrame({'a': [[2010, 1],[2011, 5],[2012, 10]]})

df[['a1', 'a2']] = df['a'].apply(pd.Series)