如何访问/拆分包含列表的列中的项目

时间:2018-08-16 17:35:37

标签: python pandas

假设我收到的数据集具有与此类似的结构(我知道这种结构并不典型。)

以下代码仅是生成一个看起来像我的数据的数据框的示例。

tmp = pd.DataFrame(
    [
        {'foo': 123, 'bar': [1, 2]}, 
        {'foo': 456, 'bar': [1, 2]} 
    ] 
)


   foo    item
0  123  [1, 2]
1  456  [1, 2]

有没有一种简单的方法来

  • 访问bar ..中的项目,例如df.bar [1],结果为2? (这显然不起作用)
  • 或将bar列拆分为bar.0,bar.1等。

理想情况下,我想绘制bar [0] vs bar [1]中的所有项目

请注意,栏中的列表不限于2个,其数量可能会有所不同。

2 个答案:

答案 0 :(得分:4)

是的,有。使用str.get

tmp.bar.str.get(0)

0    1
1    1
Name: bar, dtype: int64

tmp.bar.str.get(1)

0    2
1    2
Name: bar, dtype: int64

要拆分,请使用pandas DataFrame构造函数

col_names = ['bar.0', 'bar.1'] # Notice you can dinamically create this if needed
pd.DataFrame(tmp.bar.values.tolist(), columns=col_names)

    bar.0   bar.1
0   1       2
1   1       2

答案 1 :(得分:2)

对于第二个请求,您可以应用pd.Series,并与原始数据框串联:

>>> pd.concat((tmp,tmp.bar.apply(pd.Series).add_prefix('bar_')), axis=1)
      bar  foo  bar_0  bar_1
0  [1, 2]  123      1      2
1  [1, 2]  456      1      2

即使bar中的元素数量可变,此方法也有效:

>>> tmp
         bar  foo
0  [1, 2, 3]  123
1     [1, 2]  456

>>> pd.concat((tmp,tmp.bar.apply(pd.Series).add_prefix('bar_')), axis=1)
         bar  foo  bar_0  bar_1  bar_2
0  [1, 2, 3]  123    1.0    2.0    3.0
1     [1, 2]  456    1.0    2.0    NaN