将元组列表转换为 Pandas 系列

Posted

技术标签:

【中文标题】将元组列表转换为 Pandas 系列【英文标题】:Converting a list of tuples to a Pandas series 【发布时间】:2019-04-21 04:00:17 【问题描述】:

我有一个要转换为系列的元组列表。

return array2

[(0, 0.07142857142857142),
  (0, 0.07142857142857142),
  (1, 0.08333333333333333),
  (1, 0.3333333333333333),
  (1, 0.3333333333333333),
  (1, 0.08333333333333333),
  (3, 0.058823529411764705),
  (3, 0.058823529411764705)]

我尝试通过将列表转换为字典然后转换为系列来做到这一点:

 a = pd.Series(dict(array2))

然而,生成的 Series 并没有按照我的需要运行。它似乎丢弃了key:value 对(可能是任意的?)

例如

return a

 0    0.071429
 1    0.083333
 3    0.058824

如何在不删除任何键值对的情况下获得系列?

【问题讨论】:

【参考方案1】:

假设你的元组列表是

tuples = [(0, 0.07142857142857142),
  (0, 0.07142857142857142),
  (1, 0.08333333333333333),
  (1, 0.3333333333333333),
  (1, 0.3333333333333333),
  (1, 0.08333333333333333),
  (3, 0.058823529411764705),
  (3, 0.058823529411764705)]

我会使用(显式优于隐式):

pd.Series([value for _, value in tuples], index=[index for index, _ in tuples])

但是,我也会重新考虑系列数据格式是否合适且有意义:索引实际上就像一个字典,即将一个唯一值映射到一个值。

【讨论】:

【参考方案2】:

您可以使用np.transpose 解压缩列,然后创建pd.Series

import numpy as np
import pandas as pd

x, y = np.transpose(array2)
pd.Series(y, x)

【讨论】:

这比pd.Series.T(转置)快吗? 或者,您可以使用x, y = zip(*array2) 来省去加载 Numpy 的麻烦。此外,这保留了索引的类型 (int)。 哦。 @jpp 已经建议了这一点。对不起。【参考方案3】:

使用MultiIndex

pd.MultiIndex.from_tuples(L).to_frame()[1].reset_index(level=1,drop=True)
Out[79]: 
0    0.071429
0    0.071429
1    0.083333
1    0.333333
1    0.333333
1    0.083333
3    0.058824
3    0.058824
Name: 1, dtype: float64

【讨论】:

开箱即用的解决方案:)【参考方案4】:

问题在于,当您将元组列表转换为字典时,Python 会删除所有重复的键,并且只使用每个键的最后一个值。这是必要的,因为每个键在字典中只能出现一次。因此,您需要使用一种保留所有记录的方法。这将做到这一点:

df = pd.DataFrame.from_records(array2, columns=['key', 'val'])
df = df.set_index('key')
a = df['val']

例子:

import pandas as pd
array2 = [
    (0, 0.07142857142857142),
    (0, 0.07142857142857142),
    (1, 0.08333333333333333),
    (1, 0.3333333333333333),
    (1, 0.3333333333333333),
    (1, 0.08333333333333333),
    (3, 0.058823529411764705),
    (3, 0.058823529411764705)
]

df = pd.DataFrame.from_records(array2, columns=['key', 'val'])
df = df.set_index('key')
a = df['val']
print(a)
# key
# 0    0.071429
# 0    0.071429
# 1    0.083333
# 1    0.333333
# 1    0.333333
# 1    0.083333
# 3    0.058824
# 3    0.058824
# Name: val, dtype: float64

【讨论】:

【参考方案5】:

使用zip 和序列解包:

idx, values = zip(*L)

a = pd.Series(values, idx)

对于重复的索引,如在您的数据中,dict 将无济于事,因为不允许重复的字典键:dict 将仅采用提供的每个键的最后一个值。

【讨论】:

【参考方案6】:

在第一列使用DataFrame 构造函数和set_index,然后为Series 选择第二列:

a = pd.DataFrame(array2).set_index(0)[1]
print (a)
0
0    0.071429
0    0.071429
1    0.083333
1    0.333333
1    0.333333
1    0.083333
3    0.058824
3    0.058824
Name: 1, dtype: float64

或者创建 2 个列表并传递给 Series 构造函数:

idx = [x[0] for x in array2]
vals = [x[1] for x in array2]

a = pd.Series(vals, index=idx)
print (a)
0    0.071429
0    0.071429
1    0.083333
1    0.333333
1    0.333333
1    0.083333
3    0.058824
3    0.058824
dtype: float64

【讨论】:

嗨,如果我只想要一列这个元组......怎么做@jezrael

以上是关于将元组列表转换为 Pandas 系列的主要内容,如果未能解决你的问题,请参考以下文章

如何将元组列表转换为 pandas 数据框,以便每个元组的第一个值代表一列?

将元组中的列表转换为numpy数组?

将元组列表转换为字典

Python:将元组列表转换为dict列表

将元组列表列表转换为 dict 未按预期工作

Python:将元组列表转换为对象列表?