将元组列表转换为 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 系列的主要内容,如果未能解决你的问题,请参考以下文章